0

我需要找到某个哈希元素,其中一个键等于某个值。我尝试了很多方法,但似乎无法用jsonpathgem 弄清楚。

需要在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,而不是哈希。
我不能通过 ruby​​ 做到这一点,这不是完全正确的解决方案。但这可能对您有所帮助。

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 回答