您不能连接返回的 JSON 格式的字符串,to_gmaps4rails
因为一旦解码它们就不会产生有效的对象。
如果我有一些我想发送的对象:
loc1 = {"longitude" => "2.13012", "latitude" => "48.8014"}
loc2 = {"longitude" => "-90.556", "latitude" => "41.0634"}
并像这样将它们转换为 JSON to_gmaps4rails
:
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
这会将位置解码回它们的“pre-JSON”状态,将它们附加到数组中,然后以 JSON 格式返回数组。