使用 jq 有条件地将元素添加到 json 数组
Conditionally add element to json array using jq
我正在使用 jq 将字符串添加到 JSON 数组,效果很好,但我只想添加尚不存在的字符串。我已经尝试过 unique、has、not 等。我遗漏了一两块拼图。
这是我的起始 json 文件,foo.json:
{
"widgets": [
{
"name": "foo",
"properties": [
"baz"
]
},
{
"name": "bar"
}
]
}
这是我构建的添加字符串的 jq 命令,即使它已经存在:
$ cat foo.json | jq '.widgets[] | select(.name=="foo").properties |= .+ ["cat"]'
这是我尝试的最新版本。
$ cat foo.json | jq '.widgets[] | select(.name=="foo").properties | has("cat") | not | .properties += ["cat"]'
jq: error: Cannot check whether array has a string key
正如他们所说,给猫剥皮的方法不止一种,但也许这会给你一些想法:
.widgets[]
| select(.name=="foo")
| select(.properties | index("cat") | not)
| .properties += ["cat"]
根据您的输入,结果是:
{
"name": "foo",
"properties": [
"baz",
"cat"
]
}
以下可能更接近您要查找的内容:
.widgets |= [ .[] | if .properties|index("cat")|not
then .properties += ["cat"]
else .
end]
有很多方法可以做到这一点。
假设数组的元素应该是唯一的,您的用例强烈暗示了这一点,您可以在添加后通过 unique
过滤器传递结果数组。
$ cat foo.json | jq '.widgets[] | select(.name=="foo").properties |= (.+ ["cat"] | unique)'
我正在使用 jq 将字符串添加到 JSON 数组,效果很好,但我只想添加尚不存在的字符串。我已经尝试过 unique、has、not 等。我遗漏了一两块拼图。
这是我的起始 json 文件,foo.json:
{
"widgets": [
{
"name": "foo",
"properties": [
"baz"
]
},
{
"name": "bar"
}
]
}
这是我构建的添加字符串的 jq 命令,即使它已经存在:
$ cat foo.json | jq '.widgets[] | select(.name=="foo").properties |= .+ ["cat"]'
这是我尝试的最新版本。
$ cat foo.json | jq '.widgets[] | select(.name=="foo").properties | has("cat") | not | .properties += ["cat"]'
jq: error: Cannot check whether array has a string key
正如他们所说,给猫剥皮的方法不止一种,但也许这会给你一些想法:
.widgets[]
| select(.name=="foo")
| select(.properties | index("cat") | not)
| .properties += ["cat"]
根据您的输入,结果是:
{
"name": "foo",
"properties": [
"baz",
"cat"
]
}
以下可能更接近您要查找的内容:
.widgets |= [ .[] | if .properties|index("cat")|not
then .properties += ["cat"]
else .
end]
有很多方法可以做到这一点。
假设数组的元素应该是唯一的,您的用例强烈暗示了这一点,您可以在添加后通过 unique
过滤器传递结果数组。
$ cat foo.json | jq '.widgets[] | select(.name=="foo").properties |= (.+ ["cat"] | unique)'