首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JsonPath过滤哈希

使用JsonPath过滤哈希
EN

Stack Overflow用户
提问于 2012-11-17 02:50:09
回答 2查看 1.5K关注 0票数 0

我需要找到某个散列元素,其中一个键等于某个值。我尝试了很多方法,但似乎无法用jsonpath gem解决这个问题。

需要获取grip == 'bad'所在位置的tire标签

代码语言:javascript
复制
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

无结果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-20 23:31:56

[?()]筛选器只对数组有效(或者至少对数组或散列有效,不能同时对两者都有效)。为了让它正常工作,我必须将:tire散列包含在一个数组中。

原件:

代码语言:javascript
复制
:tire => {:grip => "good", :color => "black"}

新的:

代码语言:javascript
复制
:tire => [{:grip => "good", :color => "black"}]

这是一个对我有效的“修复”。如果有人修复了jsonpath gem,使其同时适用于数组和散列(同一类型的散列),那会更好。

票数 2
EN

Stack Overflow用户

发布于 2012-11-17 02:55:14

在JsonPath.on中,第一个参数必须是json,而不是哈希。

我不能在ruby上这样做,它不是完全正确的解决方案。但这可能会对你有所帮助。

代码语言:javascript
复制
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"}]
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13422607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档