我需要找到一个哈希元素,其中一个键等于某个值。我已经尝试了很多方法,似乎无法用jsonpath
gem来解决这个问题。
需要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 :(得分:2)
[?()]
过滤器仅适用于数组(或至少适用于数组或散列,不能同时适用于两者)。为了使它工作,我不得不将:tire
哈希包含在一个数组中。
原件:
:tire => {:grip => "good", :color => "black"}
新:
:tire => [{:grip => "good", :color => "black"}]
这是一个适合我的“修复”。如果有人修复了jsonpath
gem以使其适用于数组和哈希(同一类型和同时),那会更好。
答案 1 :(得分:0)
在JsonPath.on中,第一个参数必须是json,而不是hash 我不能在红宝石上做到这一点,这不是完全正确的解决方案。但这可能对你有帮助。
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"}]