Nie można złączyć JSON sformatowane ciągi zwracanych przez to_gmaps4rails
ponieważ nie spowoduje ważnego obiektu raz dekodowany.
Jeśli mam jakieś obiekty chcę wysłać:
loc1 = {"longitude" => "2.13012", "latitude" => "48.8014"}
loc2 = {"longitude" => "-90.556", "latitude" => "41.0634"}
i konwertować je do formatu JSON jak to_gmaps4rails
robi:
loc1_json = loc1.to_json
=> "{\"longitude\":\"2.13012\",\"latitude\":\"48.8014\"}"
loc2_json = loc2.to_json
=> "{\"longitude\":\"-90.556\",\"latitude\":\"41.0634\"}"
Są dwa obiekty JSON-zakodowane jako ciągi.
złączyć powstałe ciągi:
loc1_json + loc2_json
=> "{\"longitude\":\"2.13012\",\"latitude\":\"48.8014\"}{\"longitude\":\"-90.556\",\"latitude\":\"41.0634\"}"
i wysłać je do innej aplikacji z dekodera JSON, Wezmę:
JSON[loc1_json + loc2_json]
JSON::ParserError: 743: unexpected token at '{"longitude":"-90.556","latitude":"41.0634"}'
Parser czyni go jedynie poprzez ciąg partway przed nim znajduje separator zamykający i wie, że wystąpił błąd.
Mogę je opakować w tablicę lub hasz, a następnie ponownie kodować do JSON-a, ale to nie pomoże, ponieważ poszczególne ciągi JSON zostaną zakodowane dwukrotnie i będą musiały zostać dwukrotnie odkodowane, aby odzyskać oryginalne dane:
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"}]
To nie jest sytuacja dekoder JSON spodziewa się, że tak, że wymaga trochę ostry JavaScript po stronie klienta do korzystania z dekodera JSON magiczny pierścień dwukrotnie.
Rzeczywisty roztwór do dekodowania ich z powrotem do ich natywnej Ruby obiektów, następnie ponownego zakodowania ich w tablicy albo mieszania, a następnie wysłać je:
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\"}]"
Wartości są odpowiednio zakodowanego się i może być wysyłane do przeglądarki docelowego lub aplikacji, które mogą następnie sensu otrzymanych danych, a nie jako tablica łańcuchów jak powyżej, ale jako tablica skrótów danych:
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
Stosując że do kodu, tutaj co należy zrobić:
@json = []
nearby_sales.each do |sale|
@json << JSON[sale.locations.to_gmaps4rails]
end
@json.to_json
To dekoduje położenia z powrotem do ich stanu "pre-JSON", dołącza je do tablicy, a następnie zwraca tablicę w formacie JSON.
Nie chcesz tablicy? W przeciwnym razie byłby to obiekt json z rzędu bez przecinków i struktury otaczającej. –