2012-11-16 50 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。抱歉。 –