2013-04-25 58 views
0

我正在從似乎處於JSON的網頁下載內容。它是具有以下格式的大文件:Ruby中奇怪的JSON解析問題

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

這些條目大約有1000個,其中每個條目都包含在括號內。當我下載使用RestClient.get(開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命令正在工作,我可以使用它們,但令人不安的是它擾亂了對象的條目和順序。

+3

對象是無序的。沒有「加擾」,因爲沒有定義的順序。 – 2013-04-25 19:13:14

+0

to_json方法只是將內容轉儲到一個json字符串,這就是爲什麼你不能按照你想要的方式索引它。你基本上只是使用該方法將你的json字符串轉換成json字符串。 – 2013-04-25 20:41:46

+0

啊我看到了,謝謝你解釋了兩者的區別 – shadowprice 2013-04-26 12:52:39

回答

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 
+0

謝謝,那就是我最終做的! – shadowprice 2013-04-26 12:51:23