2016-12-15 71 views
1

問題用通配符解析RUBY中的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. 簡單地將JSON對象大於5內識別關於 'availableQuantity' 的值:

    Q = JSON.parse(量)

    q.find {|鍵|鍵[ 「availableQuantity」]> 5}

然而,這將返回錯誤: 「{類型錯誤}字符串的隱式轉換成整數」。
我google了這個錯誤,但我不明白這個問題的意義。

甚至

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' - 當然!我將一個整數與一個字符串進行比較。 用於隔離任何連續數字的正則表達式非常好。 這非常有幫助 - 非常感謝Amadan。 –