我正在尝试使用to_gmaps4rails
块中的each
结果创建一组地图标记。在具有有效地理坐标的数组上,to_gmaps4rails
方法生成有效的JSON。
我正在使用Mongoid,并且我的地理坐标位于这样的子集合中:
Account.locations.coordinates
这是我的控制器代码。 nearby_sales
是Accounts
的集合:
@json = String.new
nearby_sales.each do |sale|
@json << sale.locations.to_gmaps4rails
end
浏览器抱怨我的@json
格式不正确。有没有将有效JSON附加在一起的Ruby方法?
您无法连接to_gmaps4rails
返回的JSON格式的字符串,因为它们一旦解码就不会产生有效的对象。
如果我有一些要发送的对象:
loc1 = {"longitude" => "2.13012", "latitude" => "48.8014"}
loc2 = {"longitude" => "-90.556", "latitude" => "41.0634"}
并像to_gmaps4rails
一样将它们转换为JSON:
loc1_json = loc1.to_json
=> "{\"longitude\":\"2.13012\",\"latitude\":\"48.8014\"}"
loc2_json = loc2.to_json
=> "{\"longitude\":\"-90.556\",\"latitude\":\"41.0634\"}"
它们是作为字符串的两个JSON编码对象。
连接结果字符串:
loc1_json + loc2_json
=> "{\"longitude\":\"2.13012\",\"latitude\":\"48.8014\"}{\"longitude\":\"-90.556\",\"latitude\":\"41.0634\"}"
并使用JSON解码器将它们发送到另一个应用程序,我会得到:
JSON[loc1_json + loc2_json]
JSON::ParserError: 743: unexpected token at '{"longitude":"-90.556","latitude":"41.0634"}'
解析器仅在找到结束定界符并知道有错误之前,才使它通过字符串。
我可以将它们包装在数组或哈希中,然后再次编码为JSON,但这无济于事,因为单个JSON字符串将被编码两次,并且需要再次解码两次才能恢复原始状态。数据:
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"}]
这不是JSON解码器所期望的情况,因此,需要在客户端使用一些时髦的JavaScript才能使用魔术JSON解码器环两次。
真正的解决方案是先将它们解码回其本机Ruby对象,然后将它们重新编码为数组或哈希,然后将它们发送:
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\"}]"
这些值现在已经正确编码,可以发送到目标浏览器或应用程序,然后它们可以理解结果数据,而不是上面的字符串数组,而是数据散列数组:
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
将其应用于您的代码,这是需要做的事情:
@json = [] nearby_sales.each do |sale| @json << JSON[sale.locations.to_gmaps4rails] end @json.to_json
这会将位置解码回它们的“ JSON之前”状态,将它们附加到数组,然后以JSON格式返回数组。
require 'json'
@json = Array.new
nearby_sales.each do |sale|
@json << sale.locations.to_gmaps4rails
end
@json.to_json
您可以随时尝试此