Ruby的奇怪JSON解析问题

时间:2013-04-25 19:10:55

标签: ruby json parsing

我正在从似乎是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命令正在工作,我可以使用它们,但令人不安的是它扰乱了对象的条目和顺序。

1 个答案:

答案 0 :(得分:0)

尽管数据以字符串形式排序,但表示无序数据集。这一行:

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