使用jq有条件地将元素添加到json数组

时间:2015-08-23 14:01:23

标签: json jq

我使用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

2 个答案:

答案 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]