2012-04-12 85 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" 
      } 
     ] 
    } 
} 

我需要做的是团体经市,州和国家的组合数据,但仍从每个项目返回数据。

因此,例如,“伯明翰,AL,美国”组,但仍然能够遍历每个事件的status(即交付,送货,到达扫描)。

+0

事实上,这是JSON是真的无关紧要,对吧?您可以使用'JSON.parse'将其转换为Ruby哈希,然后使用该哈希(如果需要,最终将其返回给JSON)。 – Phrogz 2012-04-12 03:30:14

回答

4

你想要的法宝是Enumerable#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 

注意,在上文中,loc是三个元件阵列由group_by评估的块返回,并且events是在同一组的所有项目的阵列。

+0

现货。正是我在找什么。谢谢! – Shpigford 2012-04-12 03:45:45

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 2012-04-12 02:59:08

+0

退房http://stackoverflow.com/questions/5863477/how-do-i-build-a-json-object。它描述了如何在Ruby中构建JSON对象。没有看到你的代码,我不能比这更具体。如果有帮助,'[]'符号表示“数组”,JSON由每个城市的单独数组组成。 – jmort253 2012-04-12 03:03:35

+0

另外,看看这个。它有更复杂的JSON字符串的示例:http://flori.github.com/json/doc/index.html – jmort253 2012-04-12 03:05:51