我使用jq将字符串添加到JSON数组中,并且效果很好,但我只想添加尚不存在的字符串。我尝试过独特,有,而不是等等。我错过了一两块拼图。
这是我的首发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
答案 0 :(得分:8)
有很多方法可以做到这一点。
假设数组的元素应该是唯一的,您的用例强烈暗示,您可以通过unique
过滤器在添加后传递结果数组。
$ cat foo.json | jq '.widgets[] | select(.name=="foo").properties |= (.+ ["cat"] | unique)'
答案 1 :(得分:0)
正如他们所说,有一种方法可以给猫皮肤,但也许这会给你一些想法:
.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]