我已经在这里问了一个类似的问题- Parse json and choose items\keys upon condition,但这次略有不同。
示例如下:
[
{
"item1": "value123",
"array0": [
{
"item2": "aaa"
}
]
},
{
"item1": "value456",
"array1": [
{
"item2": "bbb"
}
]
},
{
"item1": "value789",
"array2": [
{
"item2": "ccc"
}
]
}
]我想要得到"item1“的值,只有当"item2”有一个特定值的时候。
假设item2等于"bbb",那么我想要返回的只有"value456“。
我试着用jq来解决这个问题,就像我在上面提到的问题中那样,但没有用,因为我不能从比我用jq的select和map搜索的值更高的级别提取值。
发布于 2015-07-21 23:03:25
多亏了递归运算符..的魔力,才有了一个更简单的解决方案
jq -r '.[] | select(.. | .item2? == "bbb").item1'
基本上,对于原始数组中的每个(.[])对象,只选择(select)那些递归(..)名为.item2等于"bbb"的键,然后选择所述对象的.item1属性。
发布于 2015-07-21 22:13:47
在jq的手册中找到了解决方案(使用#ifthenelse和#Objects) -- http://stedolan.github.io/jq/manual
jq -r '{name1: .[].item1, name2: .[].array[].item2} | /
if .item2 == "bbb" then .name1 elif .item2 != "bbb" then empty else empty end'发布于 2015-07-22 10:01:14
如果你发现..的魔力。对于您的目的来说,功能太强大了,以下内容可能会有用。它限制搜索"item2“键。
def some(condition): reduce .[] as $x
(false; if . then . else $x|condition end);
.[]
| to_entries
| select( some( .value | (type == "array") and some(.item2 == "bbb")) )
| from_entries
| .item1如果您的jq有任何/1,则使用它而不是某些/1。
https://stackoverflow.com/questions/31540337
复制相似问题