Yakut

2012-12-21 23 views
9

içinde JSON nesnelerini birlikte ekleme each satırında to_gmaps4rails sonuçlarına sahip bir harita işareti grubu oluşturmaya çalışıyorum. Geçerli coğrafi koordinatlara sahip bir dizide to_gmaps4rails yöntemi geçerli JSON üretir. Ben Mongoid ve benim jeo koordinatları kullanıyorumYakut

şöyle bir alt koleksiyonunda şunlardır:

Account.locations.coordinates 

İşte benim denetleyicisi kodudur.

@json = String.new 
nearby_sales.each do |sale| 
    @json << sale.locations.to_gmaps4rails 
end 

tarayıcı benim @json iyi oluşturuluyor değil şikayet: nearby_salesAccounts topluluğudur. Geçerli JSON'ı birlikte eklemek için bir Ruby yolu var mı? bir zamanlar deşifre geçerli bir nesne neden olmaz çünkü

+2

Diziler ister miydiniz? Aksi takdirde, virgül veya çevreleyen yapıya sahip olmayan bir sıradaki json nesneleri olur. –

cevap

18

Sen to_gmaps4rails tarafından döndürülen JSON formatlı dizeleri bitiştirmek olamaz.

ben göndermek istiyorum bazı nesneleri varsa:

loc1 = {"longitude" => "2.13012", "latitude" => "48.8014"} 
loc2 = {"longitude" => "-90.556", "latitude" => "41.0634"} 

Ve to_gmaps4rails gibi JSON çevirebiliriz yapar:

loc1_json = loc1.to_json 
=> "{\"longitude\":\"2.13012\",\"latitude\":\"48.8014\"}" 
loc2_json = loc2.to_json 
=> "{\"longitude\":\"-90.556\",\"latitude\":\"41.0634\"}" 

Bunlar dizeleri olarak iki JSON kodlanmış nesneleri konum.

Concatenate çıkan dizeleri:

loc1_json + loc2_json 
=> "{\"longitude\":\"2.13012\",\"latitude\":\"48.8014\"}{\"longitude\":\"-90.556\",\"latitude\":\"41.0634\"}" 

Ve bir JSON dekoderi ile başka bir uygulamaya göndermek, ben alırsınız:

JSON[loc1_json + loc2_json] 
JSON::ParserError: 743: unexpected token at '{"longitude":"-90.556","latitude":"41.0634"}' 

ayrıştırıcı sadece kendinden önceki partway dize aracılığıyla yapar Kapanış sınırlayıcı bulur ve bir hata olduğunu bilir.

Bunları bir diziye veya karma haline getirebilir ve daha sonra JSON'a yeniden kodlayabilirim, ancak bu, JSON dizelerinin her biri iki kez kodlanmış olacağından ve geri dönmek için iki kez deşifre edilmesi gerektiğinden yardımcı olmaz orijinal veriler: iki kez sihirli JSON dekoder-halkasını kullanmak için istemci tarafında bazı korkak JavaScript gerektirmeyen diye,

JSON[([loc1_json, loc2_json]).to_json] 
=> ["{\"longitude\":\"2.13012\",\"latitude\":\"48.8014\"}", 
    "{\"longitude\":\"-90.556\",\"latitude\":\"41.0634\"}"] 

JSON[([loc1_json, loc2_json]).to_json].map{ |s| JSON[s] } 
=> [{"longitude"=>"2.13012", "latitude"=>"48.8014"}, 
    {"longitude"=>"-90.556", "latitude"=>"41.0634"}] 

Bu JSON dekoder beklediği bir durum değil.Şimdi

array_of_json = [loc1_json, loc2_json].map{ |s| JSON[s] }.to_json 
=> "[{\"longitude\":\"2.13012\",\"latitude\":\"48.8014\"},{\"longitude\":\"-90.556\",\"latitude\":\"41.0634\"}]" 

değerleri doğru kodlanır ve şunlar olabilir:

gerçek çözelti, ardından dizi veya karma içine yeniden kodlamak nesneleri geri doğal Ruby bunları deşifre etmek, daha sonra göndermek Daha sonra değil yukarıdaki gibi dizelerden oluşan bir dizi olarak, ortaya çıkan verilerin mantıklı olabilir hedef tarayıcı veya app, gönderilen, ancak veri sağlamalarının bir dizi olarak:

JSON[array_of_json] 
=> [{"longitude"=>"2.13012", "latitude"=>"48.8014"}, 
    {"longitude"=>"-90.556", "latitude"=>"41.0634"}] 

loc1 == JSON[array_of_json][0] 
=> true 
loc2 == JSON[array_of_json][1] 
=> true 

kodunuzu o uygulamak, burada Ne yapılması gerekiyor:

Bu, konumları "JSON öncesi" durumuna geri çözer, diziye ekler, ardından diziyi JSON biçiminde döndürür.

+0

Mükemmel çalıştı! Çalışma kodu için özellikle de büyük açıklama için teşekkür ederiz! – SteveO7

+0

One issue Umarım bana yardımcı olabilirsiniz. Json şimdi iyi oluşmuş olmasına rağmen, karma dizileri dizileri içerir. [[{"Lat": 39, "lng" gibi: - 104}, {"lat": 39, "lng": - 105}], [{"lat": 39, "lng": - 104.5]] bir seviye çok derin yaratmak. Bloğun içindeki ham karıncaları eklemenin bir yolu var mı? – SteveO7

+0

Bekleyin ... Sanırım anladım. Ekledim .flatten! son çizgiye böyle; @ json.flatten! .to_json ve tarayıcıya dönen json beklediğim gibi görünüyor. Flatten kullanımı ile ilgili bazı uyarıların beklenmedik sonuçlara neden olabileceğini, bunun hakkında herhangi bir tavsiyede bulunulduğunu gördüm. – SteveO7

2
require 'json' 

@json = Array.new 
nearby_sales.each do |sale| 
    @json << sale.locations.to_gmaps4rails 
end 
@json.to_json