使用JsonPath过滤哈希

时间:2012-11-16 18:50:09

标签: ruby hash jsonpath

我需要找到一个哈希元素,其中一个键等于某个值。我已经尝试了很多方法,似乎无法用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

没有结果。

2 个答案:

答案 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"}]