2012-11-16 84 views
0

我需要找到某個哈希元素,其中某個鍵等於某個值。我已經嘗試了很多方法,似乎無法用jsonpath gem弄明白。使用JsonPath篩選哈希

需要去tire標籤,其中grip == 'bad'

require "jsonpath" 

hash = { 
    :id => 1, 
    :cars => [ 
     {:id => 1, :tire => {:grip => "good", :color => "black"}}, 
     {:id => 2, :tire => {:grip => "bad", :color => "red"}}, 
     {:id => 3, :tire => {:grip => "good", :color => "green"}} 
    ] 
} 

puts JsonPath.on(hash, "$..tire[?(@['grip'] == 'bad')]").inspect 

沒有結果。

+0

輪胎標籤是什麼?什麼是「抓地力」?你的「我的代碼」中的「Hash」和「grip」包含':grip';它與某些方面有什麼關係?什麼是'THE_HASH'? – sawa

+0

「輪胎」標籤是上述散列中的關鍵之一。 ''grip''和':grip'對'jsonpath'沒有什麼影響。 'THE_HASH'是我上面發佈的哈希。 –

回答

2

[?()]濾波器只對陣列(或至少爲任一陣列或哈希,不能同時在同一時間)。爲了使其工作,我必須將:tire散列放在一個數組中。

原文:

:tire => {:grip => "good", :color => "black"} 

新:

:tire => [{:grip => "good", :color => "black"}] 

這是一個 「修復」 爲我的作品。如果有人修復了jsonpath gem使其適用於數組和哈希(同一類型和同時),那將會更好。

+0

如果它可以適用於數組和哈希,那將會很棒。你知道任何會將JSON的每個元素轉換成一個Array的東西嗎? – Trinculo

0

在JsonPath.on第一個參數必須是json,而不是散列。
我不能做到紅寶石,它不是完全正確的解決方案。但可能會對你有所幫助。

require 'jsonpath' 
require 'json' 

hash = { 
    :id => 1, 
    :cars => [ 
     {:id => 1, :tire => {:grip => "good", :color => "black"}}, 
     {:id => 2, :tire => {:grip => "bad", :color => "red"}}, 
     {:id => 3, :tire => {:grip => "good", :color => "green"}} 
    ] 
} 

json = hash.to_json 
obj = JsonPath.new("$..tire")[json] 
result = obj.inject(Array.new){|res, x| res << x if x["grip"]=='bad'; res } 

p result # [{"grip"=>"bad", "color"=>"red"}] 
+0

你用'jsonpath'創業板試了一下嗎?我編輯了我的問題,控制值實際上是字符串。 –

+0

您是否嘗試過第二種解決方案?發佈答案前請先測試。 –

+0

不,不幸的是,這不是解決方案。我不知道,如何編寫正確的JsonPath。抱歉。 –