jq过滤子对象值

时间:2015-02-19 19:28:15

标签: json jq

我有一个json文件people.json:

{
  "Joe" : {"Job" : "Clown", "Age" : 22},
  "Sally" : {"Job" : "Programmer", "Age" : 32},
  "Anne" : {"Job" : "Clown", "Age" : 29}
}

我想选择一个小丑的人。我的输出应该如下所示:

{
  "Joe" : {"Job" : "Clown", "Age" : 22},
  "Anne" : {"Job" : "Clown", "Age" : 29}
}

我在

中尝试了..运算符
cat people.json | jq '. | map(select(.Job == "Clown"))'

但它似乎在多个级别匹配乔和安妮并产生更多输出然后我想要。有任何想法吗?感谢。

2 个答案:

答案 0 :(得分:17)

使用with_entries转换为/从中间格式转换为中间格式,该格式将数据表示为具有keyvalue元素的对象数组:

cat people.json | jq 'with_entries(select(.value.Job == "Clown"))'

根据此处的文档:http://stedolan.github.io/jq/manual/

答案 1 :(得分:2)

以下是使用 reduce

的解决方案
  . as $v
| reduce keys[] as $k (
    {};
    if $v[$k].Job == "Clown" then .[$k] = $v[$k] else . end
  )