首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Ruby中一起追加JSON对象

如何在Ruby中一起追加JSON对象
EN

Stack Overflow用户
提问于 2012-12-21 20:48:54
回答 3查看 22.5K关注 0票数 10

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

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

代码语言:javascript
复制
Account.locations.coordinates  

这是我的控制器代码。nearby_salesAccounts的集合

代码语言:javascript
复制
@json = String.new
nearby_sales.each do |sale|
  @json << sale.locations.to_gmaps4rails
end

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-21 21:41:03

不能连接to_gmaps4rails返回的JSON格式的字符串,因为一旦解码它们就不会产生有效的对象。

如果我有一些想要发送的对象:

代码语言:javascript
复制
loc1 = {"longitude" => "2.13012", "latitude" => "48.8014"}
loc2 = {"longitude" => "-90.556", "latitude" => "41.0634"}

并像to_gmaps4rails一样将它们转换为JSON:

代码语言:javascript
复制
loc1_json = loc1.to_json
=> "{\"longitude\":\"2.13012\",\"latitude\":\"48.8014\"}"
loc2_json = loc2.to_json
=> "{\"longitude\":\"-90.556\",\"latitude\":\"41.0634\"}"

它们是两个JSON编码的字符串对象。

连接生成的字符串:

代码语言:javascript
复制
loc1_json + loc2_json
=> "{\"longitude\":\"2.13012\",\"latitude\":\"48.8014\"}{\"longitude\":\"-90.556\",\"latitude\":\"41.0634\"}"

并将它们发送到另一个带有JSON解码器的应用程序,我会得到:

代码语言:javascript
复制
JSON[loc1_json + loc2_json]
JSON::ParserError: 743: unexpected token at '{"longitude":"-90.556","latitude":"41.0634"}'

解析器在找到结束分隔符并知道有错误之前,只能检查字符串的一部分。

我可以将它们包装在数组或散列中,然后再次编码为JSON,但这没有什么帮助,因为单独的JSON字符串将被编码两次,并且需要再次解码两次才能获得原始数据:

代码语言:javascript
复制
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对象,然后将它们重新编码到数组或散列中,然后发送它们:

代码语言:javascript
复制
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\"}]"

这些值现在已正确编码,可以发送到目标浏览器或应用程序,然后目标浏览器或应用程序就可以理解结果数据,而不是像上面那样作为字符串数组,而是作为数据散列的数组:

代码语言:javascript
复制
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

将其应用于您的代码,以下是需要完成的工作:

代码语言:javascript
复制
@json = []
nearby_sales.each do |sale|
  @json << JSON[sale.locations.to_gmaps4rails]
end
@json.to_json

这会将位置解码回它们的"pre- JSON“状态,将它们附加到数组,然后以JSON格式返回数组。

票数 18
EN

Stack Overflow用户

发布于 2012-12-21 20:58:34

代码语言:javascript
复制
require 'json'

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

Stack Overflow用户

发布于 2019-11-03 03:58:28

你可以试一下这个

代码语言:javascript
复制
array_of_json.reduce({}){|z,x| z.merge(x)}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13990523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档