2013-11-13 2 views
0

Итак, у нас есть ответ JSON, как: Link to Formatted Sample JsonСуммируя Уплотненный Json

{"C":{"1":{"1":{"A":[18],"B":[18],"C":[20],"D":[24],"E":[24],"F":[2],"G":[15],"H":[21],"I":[8]},"2":{"A":[9],"B":[26],"C":[12],"D":[10],"E":[10],"F":[3],"G":[7]},"3":{"A":[6],"B":[4],"C":[5],"D":[3],"E":[4],"F":[13]},"4":{"A":[3],"B":[2],"C":[5],"D":[13],"E":[5],"F":[5],"G":[4],"H":[7]},"5":{"A":[10],"B":[10],"C":[10],"D":[10],"E":[10],"F":[15]},"6":{"A":[10],"B":[7],"C":[5],"D":[4],"E":[7],"F":[10],"G":[4],"H":[18]},"7":{"A":[2],"B":[18],"C":[6],"D":[3],"E":[2],"F":[5],"G":[7],"H":[5],"I":[17]},"8":{"A":[20],"B":[2],"C":[10],"D":[3],"E":[5],"F":[10]},"Review 1":{"A":[30]},"Review 2":{"A":[30]}},"2":{"1":{"A":[2],"B":[3],"C":[10],"D":[10],"E":[10],"F":[15]},"10":{"A":[10],"B":[3],"C":[3],"D":[3],"E":[20]},"11":{"A":[2],"B":[6],"C":[5],"D":[10],"E":[10],"F":[13]},"2":{"A":[5],"B":[5],"C":[5],"D":[6],"E":[6],"F":[12],"G":[6],"H":[8]},"3":{"A":[3],"B":[4],"C":[8],"D":[3],"E":[2],"F":[3],"G":[12]},"4":{"A":[10],"B":[10],"C":[10],"D":[11],"E":[10],"F":[20]},"5":{"A":[8],"B":[4],"C":[8],"D":[5],"E":[14]},"6":{"A":[5],"B":[10],"C":[14],"D":[14]},"7":{"A":[3],"B":[5],"C":[8],"D":[9],"E":[10],"F":[16]},"8":{"A":[2],"B":[2],"C":[4],"D":[2],"E":[3],"F":[6],"G":[8]},"9":{"A":[2],"B":[6],"C":[5],"D":[11]},"_mex":{"1":[9]},"Review 1":{"A":[31]},"Review 2":{"A":[30]},"Review 3":{"A":[30]}},"3":{"1":{"A":[1],"B":[1],"C":[1],"D":[2],"E":[6]},"2":{"A":[2],"B":[4],"C":[7],"D":[8],"E":[8],"F":[9]},"3":{"A":[5],"B":[8],"C":[11]},"4":{"A":[10],"B":[10],"C":[11]},"5":{"A":[2],"B":[4],"C":[5],"D":[1],"E":[3],"F":[8]},"6":{"A":[4],"B":[8],"C":[8],"D":[12],"E":[8],"F":[20]},"7":{"A":[25],"B":[12],"C":[13],"D":[15],"E":[12],"F":[20]},"8":{"A":[5],"B":[3],"C":[3],"D":[7],"E":[1],"F":[1],"G":[1],"H":[1],"I":[1],"J":[3],"K":[17]},"mex2":{"A":[7]},"_mex2":{"A":[7]},"Review 1":{"A":[30]},"Review 2":{"A":[30]}},"4":{"1":{"A":[10],"B":[2],"C":[2],"D":[8],"E":[3],"F":[3]},"2":{"A":[5],"B":[10],"C":[5],"D":[10],"E":[10]},"3":{"A":[6],"B":[4],"C":[3],"D":[11]},"4":{"A":[4],"B":[4],"C":[4],"D":[4],"E":[11],"F":[21]},"5":{"A":[5],"B":[8],"C":[3],"D":[4],"E":[5],"F":[7],"G":[15],"H":[5],"I":[5],"J":[6],"K":[14]},"6":{"A":[2],"B":[4],"C":[3],"D":[2],"E":[2],"F":[3],"G":[4],"H":[4],"I":[4],"J":[4],"K":[7],"L":[34]},"_mex2":{"A":[7]},"Review 1":{"A":[77]}}}} 

То, что я хочу сделать, это сумма всех чисел, содержащихся в ответе.

Ive пробовал перебирать все гнездо, но я был в состоянии сделать только одну секцию. Использование:

@number = 0 
json["C"]["1"]["1"].each do |key, val| 
    val.map do |x| 
     @number+=x 
    end 
end 
#=> 150 

Любые предложения, как я буду делать то же самое для json ["C"] ["1"]?

+0

Для уточнения, вы хотите указать, какой уровень иерархии JSON вы хотели бы суммировать (независимо от того, насколько высока или низка в иерархии)? Значение, если вы указали 'json [" C "]', вы бы хорошо описали все, или если вы указали 'json [" C "] [" 1 "] [" 1 "]' или 'json [" C "] ["1"] ["2"] ', вы бы только суммировали то, что было на этом уровне? –

+0

@Teeg Я хотел бы суммировать все так json ["C"] ["1"]. – user2396914

+0

Не помещайте ссылку на образец JSON; Разрыв ссылок, а затем ваш вопрос будет бессмыслицей, плюс вы заставляете людей, которые хотят помочь вам преследовать информацию, необходимую вам, которая тратит свое время. Суммируйте образец JSON в своем вопросе, где его легко увидеть и не будет подвергать ссылка-гниль. –

ответ

1

На основе JSON, вот код, который будет ходить хэш:

hash = JSON.parse(json) 

def sum_hash(h) 
    sum = 0 

    h.each do |k, v| 
    sum += v.is_a?(Hash) ? sum_hash(v) : v.first 
    end 

    sum 
end 

sum_hash(hash) # => 1964 

хэш должен быть гуляла, и каждое значение проверено, так как это нерегулярно. Если значение представляет собой еще один хеш, то sum_hash называет себя этим суб-хешем, который затем начинает движение по получателю.

Для каждого хеш-значения, которое не является хэшем, целое число извлекается из массива с использованием first и добавляется к sum. Когда метод выходит из него, возвращается текущее значение sum, поэтому после того, как хеш был сведен, последовательно добавляются значения sum.

Уменьшение JSON делает это намного проще, чтобы убедиться, что код делает правильную вещь:

json = ' 
{ 
    "C": { 
    "1": { 
     "1": { 
     "A": [1], 
     "B": [1] 
     }, 
     "2": { 
     "A": [1], 
     "B": [1] 
     }, 
     "Review 1": { 
     "A": [1] 
     }, 
     "Review 2": { 
     "A": [1] 
     } 
    } 
    } 
} 
' 

Запуск выше кода, который говорит, что сумма 6.

+0

Спасибо! Но я продолжаю получать «+»: nil не может быть принудительно введен в Fixnum (TypeError) » – user2396914

+0

Ну, код выше работает, поэтому либо ваш JSON имеет запись, которая оценивает значение nil во время разбора, либо, может быть, ваша версия Ruby устаревший. –

+0

Это работает для меня тоже, но я до сих пор получаю эту ошибку выше. Weird. – user2396914

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