0

キーの 1 つが特定の値に等しい特定のハッシュ要素を見つける必要があります。私は多くの方法を試しましたが、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

結果がありません。

4

2 に答える 2

2

フィルタは[?()]配列に対してのみ機能します(または、少なくとも配列またはハッシュのいずれかに対してのみ機能し、同時に両方に対しては機能しません)。それが機能するためには、:tireハッシュを配列で囲む必要がありました。

オリジナル:

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

新しい:

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

それは私のために働く「修正」です。誰かがjsonpathgemを修正して、配列とハッシュの両方(同じタイプで同時に)で機能するようにするとよいでしょう。

于 2012-12-20T15:31:55.913 に答える
-1

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"}]
于 2012-11-16T18:55:14.173 に答える