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

Что мне нужно сделать, это сгруппировать данные по комбинации города, штата и страны, но по-прежнему возвращать данные из каждого пункта.

Так, например, группа от «Бирмингем, штат Аризона, США», но все же сможет выполнять итерацию по каждому событию (например, «Поставка, выход за доставку», «Прибытие») по номеру status.

+0

Тот факт, что это JSON, действительно не имеет значения, не так ли? Вы можете преобразовать его в хэш-код Ruby с помощью 'JSON.parse', а затем просто работать с ним (и, если хотите, вернуть его в JSON). – Phrogz

ответ

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

0

Вы можете использовать ассоциативный массив, чтобы вы могли использовать строку в качестве ключа и использовать ее для доступа к записям, которые вы хотите группировать. Например, все события, Бирмингем будет доступ:

events.event.Birmingham[i] 

и все записи Spartanburg расположены в массиве доступны:

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" 
      } 
     ] 
    } 
} 
} 

Вот пример того, как сгенерировать JSON в Ruby. Пример был взят из 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. В нем описывается, как создать объект JSON в Ruby. Не видя кода, я не могу быть более конкретным. Если это помогает, символы '[]' означают «массивы», а JSON состоит из отдельного массива для каждого города. – jmort253

+0

Кроме того, ознакомьтесь с этим. В нем есть примеры более сложных строк JSON: http://flori.github.com/json/doc/index.html – jmort253

Смежные вопросы