0

JSON と思われる Web ページからコンテンツをダウンロードしています。次の形式の大きなファイルです。

"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 コマンドが機能しているので、それらを使用できると思いますが、オブジェクトのエントリと順序が混乱していることに当惑しています。

4

1 に答える 1

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
于 2013-04-26T06:47:51.360 に答える