2012-04-12 5 views
4

私は次のようなJSONデータを持っている:JSONをデータでグループ化しますか?

{ 
    "events": 
    { 
     "event": 
     [ 
      { 
       "city":"Birmingham", 
       "state":"AL", 
       "country":"US", 
       "lat":"33.5206608", 
       "lng":"-86.80249", 
       "status":"Delivered", 
       "occured_at":"2012-04-06 
14:17:00 UTC" 
      }, 
      { 
       "city":"Birmingham", 
       "state":"AL", 
       "country":"US", 
       "lat":"33.5206608", 
       "lng":"-86.80249", 
       "status":"Out 
For Delivery", 
       "occured_at":"2012-04-06 04:44:00 UTC" 
      }, 
      { 
       "city":"Birmingham", 
       "state":"AL", 
       "country":"US", 
       "lat":"33.5206608", 
       "lng":"-86.80249", 
       "status":"Arrival 
Scan", 
       "occured_at":"2012-04-05 19:07:00 UTC" 
      }, 
      { 
       "city":"Doraville", 
       "state":"GA", 
       "country":"US", 
       "lat":"33.8981579", 
       "lng":"-84.2832564", 
       "status":"Departure 
Scan", 
       "occured_at":"2012-04-05 17:08:00 UTC" 
      }, 
      { 
       "city":"Doraville", 
       "state":"GA", 
       "country":"US", 
       "lat":"33.8981579", 
       "lng":"-84.2832564", 
       "status":"Arrival 
Scan", 
       "occured_at":"2012-04-05 11:15:00 UTC" 
      }, 
      { 
       "city":"Spartanburg", 
       "state":"SC", 
       "country":"US", 
       "lat":"34.9495672", 
       "lng":"-81.9320482", 
       "status":"Departure 
Scan", 
       "occured_at":"2012-04-05 08:42:00 UTC" 
      }, 
      { 
       "city":"Spartanburg", 
       "state":"SC", 
       "country":"US", 
       "lat":"34.9495672", 
       "lng":"-81.9320482", 
       "status":"Arrival 
Scan", 
       "occured_at":"2012-04-05 08:21:00 UTC" 
      }, 
      { 
       "city":"Greensboro", 
       "state":"NC", 
       "country":"US", 
       "lat":"36.0726354", 
       "lng":"-79.7919754", 
       "status":"Departure 
Scan", 
       "occured_at":"2012-04-05 04:45:00 UTC" 
      }, 
      { 
       "city":"Greensboro", 
       "state":"NC", 
       "country":"US", 
       "lat":"36.0726354", 
       "lng":"-79.7919754", 
       "status":"Origin 
Scan", 
       "occured_at":"2012-04-05 00:11:00 UTC" 
      }, 
      { 
       "city":null, 
       "state":null, 
       "country":"US", 
       "status":"Billing 
Information Received", 
       "occured_at":"2012-04-04 18:20:27 UTC" 
      } 
     ] 
    } 
} 

私が行うために必要なものは、グループは、市、州、国の組み合わせによってデータであるが、それでも各項目からデータを返します。

たとえば、 "Birmingham、AL、US"でグループ化しても、各イベント(つまり配信済み、配信中止、到着スキャン)のstatusを繰り返し処理することができます。

+0

これがJSONであるという事実は本当に無関係ですね。あなたは 'JSON.parse'を使ってそれをRubyハッシュに変換し、それを使って作業することができます(必要に応じて最後にJSONに戻す)。 – Phrogz

答えて

4

したい魔法がEnumerable#group_byです:

上記において、 locは3要素アレイは group_byによって評価ブロックから返され、そして
require 'json' 
all = JSON.parse(DATA.read)['events']['event'] 
all.group_by{ |h| [h['city'],h['state'],h['country']] }.each do |loc,events| 
    puts "'#{loc.join(',')}': #{events.length} event#{:s if events.length!=1}" 
    print "--> " 
    puts events.map{ |e| e['status'] }.join(', ') 
end 

#=> 'Birmingham,AL,US': 3 events 
#=> --> Delivered, Out For Delivery, Arrival Scan 
#=> 'Doraville,GA,US': 2 events 
#=> --> Departure Scan, Arrival Scan 
#=> 'Spartanburg,SC,US': 2 events 
#=> --> Departure Scan, Arrival Scan 
#=> 'Greensboro,NC,US': 2 events 
#=> --> Departure Scan, Origin Scan 
#=> ',,US': 1 event 
#=> --> Billing Information Received 

注は、同じグループ内のすべての項目の配列です。

+0

スポットがあります。まさに私が探していたもの。ありがとう! – Shpigford

0

連想配列を使用すると、文字列をキーとして使用して、グループ化するレコードにアクセスすることができます。例えば、バーミンガムのイベントのすべてがでアクセスすることになります。

events.event.Birmingham[i] 

とスパータンバーグのすべてのレコードを介してアクセス配列に配置されています。

以下
events.event.Spartanburg[i] 

は何あなたの部分的なJSONの例でありますシリアライズされたオブジェクトは次のようになります:

{ 
"events": { 
    "event": { 
     "Birmingham": [ 
      { 
       "city": "Birmingham", 
       "state": "AL", 
       "country": "US", 
       "lat": "33.5206608", 
       "lng": "-86.80249", 
       "status": "Delivered", 
       "occured_at": "2012-04-06 14:17:00 UTC" 
      }, 
      { 
       "city": "Birmingham", 
       "state": "AL", 
       "country": "US", 
       "lat": "33.5206608", 
       "lng": "-86.80249", 
       "status": "Out For Delivery", 
       "occured_at": "2012-04-06 04:44:00 UTC" 
      } 
     ], 
     "Spartanburg": [ 
      { 
       "city":"Spartanburg", 
       "state":"SC", 
       "country":"US", 
       "lat":"34.9495672", 
       "lng":"-81.9320482", 
       "status":"Departure Scan", 
       "occured_at":"2012-04-05 08:42:00 UTC" 
      }, 
      { 
       "city": "Spartanburg", 
       "state": "SC", 
       "country": "US", 
       "lat": "34.9495672", 
       "lng": "-81.9320482", 
       "status": "Arrival Scan", 
       "occured_at": "2012-04-05 08:21:00 UTC" 
      } 
     ] 
    } 
} 
} 

以下は、RubyでJSONを生成する方法の例です。例はJSON implementation for Rubyから取られました:

puts JSON.pretty_generate([1, 2, {"a"=>3.141}, false, true, nil, 4..10]) 

そして、ここではそのコマンドによって生成されたJSONです:ここでは

[ 
    1, 
    2, 
    { 
     "a": 3.141 
    }, 
    false, 
    true, 
    null, 
    { 
     "json_class": "Range", 
     "data": [ 
     4, 
     10, 
     false 
     ] 
    } 
] 

あなたは、変形例を始めることができる方法を紹介します部分の例であります最初から:

puts JSON.pretty_generate({"events"=>{"event=>{"Birmingham"=>[{"city"=>"Birmingham","state"=>"AL"},{"city"=>"Birmingham","state"=>"AL"}]},{"Spartanburg"=>[{"city"=>"Spartanburg","state"=>"GA"}]}}}) 
+0

それは私が必要と思われるもののように見えます。現在のJSONコードをあなたの例に変換するにはどうすればよいですか? – Shpigford

+0

http://stackoverflow.com/questions/5863477/how-do-i-build-a-json-objectをご覧ください。 RubyでJSONオブジェクトを構築する方法について説明します。あなたのコードを見ることなく、私はそれ以上具体的にすることはできません。助けがあれば、 '[]'記号は「配列」を意味し、JSONは都市ごとに別々の配列で構成されます。 – jmort253

+0

また、これをチェックしてください。より複雑なJSON文字列の例があります:http://flori.github.com/json/doc/index.html – jmort253

関連する問題