使用jq根据对象中变量的值选择对象


236

我有以下json文件:

{
    "FOO": {
        "name": "Donald",
        "location": "Stockholm"
    },
    "BAR": {
        "name": "Walt",
        "location": "Stockholm"
    },
    "BAZ": {
        "name": "Jack",
        "location": "Whereever"
    }
}

我正在使用jq,并想获取“位置”为“斯德哥尔摩”的对象的“名称”元素。

我知道我可以通过

cat json | jq .[] | jq ."name"
"Jack"
"Walt"
"Donald"

但是给定子键的值(在此"location" : "Stockholm"),我无法弄清楚如何仅打印某些对象。

Answers:


341

改编自这篇关于使用jq处理JSON的文章,您可以这样使用select(bool)

$ jq '.[] | select(.location=="Stockholm")' json
{
  "location": "Stockholm",
  "name": "Walt"
}
{
  "location": "Stockholm",
  "name": "Donald"
}

30
我如何获得父级“ FOO”,“ BAR”,“ BAZ”?
spazm

184

要获取仅包含名称的流:

$ jq '.[] | select(.location=="Stockholm") | .name' json

产生:

"Donald"
"Walt"

要获得相应的(键名,“名称”属性)对流,请考虑:

$ jq -c 'to_entries[]
        | select (.value.location == "Stockholm")
        | [.key, .value.name]' json

输出:

["FOO","Donald"]
["BAR","Walt"]

他希望整个对象都基于位置:“给定子键的值,我不知道如何仅打印某些对象”
Fo。

2
选择后不需要管道:$ jq'。[] | select(.location ==“ Stockholm”)。name'json
Deepak '18

使name键变量(将shell函数与$1参数一起使用)不起作用:termux-contact-list |jq -r '.[] | select(.name=="$1")|.number'。我这样称呼cool_fn Name1。但是,这有效:termux-contact-list |jq -r '.[] | select(.name=="Name1")|.number'
Timo

如果您喜欢它可变的,是解决方案。
蒂莫(Timo)

27

我有一个类似的相关问题:如果您想要恢复原始对象格式(带有键名,例如FOO,BAR),该怎么办?

jQuery提供to_entriesfrom_entries在对象和键值对数组之间进行转换。与map周围的选择

这些函数在对象和键值对数组之间进行转换。如果给to_entries传递了一个对象,则对于输入中的每个k:v条目,输出数组都包含{“ key”:k,“ value”:v}。

from_entries进行相反的转换,with_entries(foo)是to_entries的简写| map(foo)| from_entries,对对象的所有键和值进行某些操作很有用。from_entries接受键,键,名称,名称,值和值作为键。

jq15 < json 'to_entries | map(select(.value.location=="Stockholm")) | from_entries'

{
  "FOO": {
    "name": "Donald",
    "location": "Stockholm"
  },
  "BAR": {
    "name": "Walt",
    "location": "Stockholm"
  }
}

使用with_entries简写,它将变为:

jq15 < json 'with_entries(select(.value.location=="Stockholm"))'
{
  "FOO": {
    "name": "Donald",
    "location": "Stockholm"
  },
  "BAR": {
    "name": "Walt",
    "location": "Stockholm"
  }
}

1
一直困扰我的一件事是,您需要记住,在使用时with_entries(),您通常还希望.valueselect子句中使用。这是因为to_entries宏将给定的条目转换为.key.value配对,这也发生在with_entries
Jaakko
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.