ruby-on-rails - 如何在 Ruby 中将 JSON 对象附加在一起

标签 ruby-on-rails ruby gmaps4rails

我正在尝试在 each block 中使用 to_gmaps4rails 的结果创建一组 map 标记。在具有有效地理坐标的数组上,to_gmaps4rails 方法会生成有效的 JSON。

我正在使用 Mongoid,我的地理坐标在一个子集合中,如下所示:

Account.locations.coordinates  

这是我的 Controller 代码。 nearby_salesAccounts 的集合:

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

浏览器提示我的 @json 格式不正确。 有没有一种 Ruby 方法可以将有效的 JSON 附加在一起?

最佳答案

您不能连接 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 格式返回数组。

关于ruby-on-rails - 如何在 Ruby 中将 JSON 对象附加在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13990523/

相关文章:

ruby - 在不评估内联 Ruby 脚本的情况下将 Haml 转换为 HTML

ruby-on-rails - 让 Gmaps4Rails 与 MongoMapper 一起工作

javascript - Gmaps4rails - Rails 4

ruby-on-rails - 带有 CA 证书的 Mongo SSL 配置仅适用于 Rails 控制台,不适用于 Rails 服务器

ruby-on-rails - Rails ActiveRecord 如何在没有多个查询的情况下链接 "where"子句?

ruby - 创建一个空数组然后用迭代器填充它是惯用的吗?

ruby 续集 gem : update a row column with a value from another row column that I know the Id

mysql - 连接表格和 map 显示

sql - 构建复杂的 Rails SQL

ruby-on-rails - 添加一个 CSS 类到 <%= f.submit %>