【问题标题】:Weird JSON parsing issues with RubyRuby 奇怪的 JSON 解析问题
【发布时间】:2013-04-25 19:10:54
【问题描述】:

我正在从似乎是 JSON 格式的网页下载内容。这是一个大文件,格式如下:

"address1":"123 Street","address2":"Apt 1","city":"City","state":"ST","zip":"xxxxx","country":"US"

大约有 1000 个这样的条目,每个条目都包含在括号内。当我使用 RestClient.get 下载页面时(open-uri 出于某种原因抛出了 http 500 错误),数据格式如下:

\"address\1":\"123 Street\",\"address2\":\"Apt 1\",\"city\":\"City\",\"state\":\"ST\",\"zip\":\"xxxxx\",\"country\":\"US\"

当我使用 json 类时

parsed = JSON.parse(data_out)

它完全打乱了数据结构中条目的顺序,以及每个条目中对象的顺序,例如:

"address1"=>"123 Street", "city"=>"City", "country"=>"US", "address2"=>"Apt 1"

如果我改用

data_j=data_out.to_json

然后我得到:

\\\"address\\\1":\\\"123 Street\\\",\\\"address2\\\":\\\"Apt 1\\\",\\\"city\\\":\\\"City\\\",\\\"state\\\":\\\"ST\\\",\\\"zip\\\":\\\"xxxxx\\\",\\\"country\\\":\\\"US\\\"

此外,似乎只使用 json 类允许我选择我想要的条目:

parsed[1]["address1"]
=> "123 Street"

data_j[1]["address1"]
TypeError: can't convert String into Integer
from (irb):17:in `[]'
from (irb):17
from :0

知道发生了什么吗?我想既然 json 命令正在工作,我可以使用它们,但令人不安的是它扰乱了对象的条目和顺序。

【问题讨论】:

  • 对象是无序的。没有“加扰”,因为没有定义的顺序。
  • to_json 方法只是将内容转储到一个 json 字符串,这就是为什么您不能按照您尝试的方式对其进行索引。您基本上只是使用该方法将您的 json 字符串转换为 json 字符串。
  • 啊我明白了,感谢您解释两者之间的区别

标签: ruby json parsing


【解决方案1】:

虽然数据以字符串形式出现有序,但它代表一个无序的数据集。行:

parsed = JSON.parse(data_out)

您使用的是将字符串形式转换为可在 Ruby 中使用的形式的正确方法。我无法从您的示例中看到完整的结构,所以我不知道顶层是数组还是基于 id 的哈希。我怀疑后者,因为您说从 Ruby 中查看时它变得无序。因此,如果您知道您对地址的哪一部分感兴趣,您可能会有如下代码:

# Writes all the cities
parsed.each do |id,data|
   puts data["city"]
end

如果外部结构是一个数组,你应该这样做:

# Writes all the cities
parsed.each do |data|
   puts data["city"]
end

【讨论】:

  • 谢谢,我就是这么做的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多