2016-12-15 3 views
1

Проблема:Разбор объекта JSON в RUBY с помощью шаблона?

Я относительно новым для программирования и обучения Руби, я работал с JSON и раньше, но были озадачены этой проблемой.

Я беру хеш, бег hash.to_json, и возвращает объект JSON, который выглядит следующим образом: «количество» =

{ 
"line_1": { 
    "row": "1", 
    "productNumber": "111", 
    "availableQuantity": "4" 
}, 
"line_2": { 
    "row": "2", 
    "productNumber": "112", 
    "availableQuantity": "6" 
}, 
"line_3": { 
    "row": "3", 
    "productNumber": "113", 
    "availableQuantity": "10" 
} 

Я хочу, чтобы найти значение «availableQuantity», что это больше, чем 5 и верните номер строки. Кроме того, я хотел бы вернуть номер строки и номер продукта.

То, что я пытался

  1. Я искал на использовании маски в запросе JSON, чтобы получить над значением «line_» для каждой записи, но не повезло.

  2. просто определить значение 'availableQuantity' внутри объекта JSON больше, чем 5:

    д = JSON.parse (количество)

    q.find {| ключ | ключ [ "availableQuantity"]> 5}

Однако это возвращает ошибку: "{TypeError} нет неявного преобразования из строки в Integer."
Я искал эту ошибку, но я не могу понять, что это значит в контексте этой проблемы.

или даже

q.find {|key, value| value > 2} 

, который возвращает ошибку: "неопределенный метод`>»для { "строки"=> "1", "productNumber"=> 111, "availableQuantity"=> 4} : Hash «

Эта попытка выглядит настолько упрощенной, что мне стыдно, но она показывает фундаментальный пробел в моем понимании того, как работать с циклом над материалом, используя перечислимый.

Может ли кто-нибудь помочь объяснить решение, и в идеале, что означают шаги в решении? Например, требуется ли в решении перечислить с помощью find? Или Ruby обрабатывает прямой запрос к json?

Это поможет мне значительно научиться.

ответ

1

I want to find the 'availableQuantity' value that's greater than 5 and [...] return the line number and the product number.

Первая проблема: ваш value не является числом, так что вы не можете сравнить его с 5. Вам нужно, чтобы конвертировать to_i.

Вторая проблема: получение номера строки проще всего с помощью регулярных выражений. /\d+/ - «любые последовательные цифры». Объединение этого ...

q.select { |key, value| 
    value['availableQuantity'].to_i > 5 
}.map { |key, value| 
    [key[/\d+/].to_i, value['productNumber'].to_i] 
} 
# => [[2, 112], [3, 113]] 
+0

'to_i' - конечно же! Я сравниваю целое число со строкой. И регулярное выражение, используемое для выделения любых последовательных цифр, отлично. Это очень помогло - спасибо Амадану. –

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