使用JQ如何将条目追加到JSON中的字典类型数组或如果数组不存在则创建它?

问题描述 投票:0回答:2

我有理想的 JSON:

{
    "environments":[
        {
            "name":"test",
            "release":"2.0"
        },
        {
            "name":"prod",
            "release":"1.0"
        },
    ]
}

此文件可以处于任何状态:

  1. 它可以是空文件,只有空对象 { }
  2. 它可以有空的“environemnts”数组
  3. 环境数组中可以有一些条目,但不是我们想要更新的条目

我需要在给定环境下更新或创建给定版本的“release”标签。

我尝试了以下变体:

(.environments[] | select(.name == "prod") | .release) = "3.0" // .environments += [{"name": "prod", "release": "3.0"}]

我也尝试过:

.environments
|=  (map(.name) | index("prod")) as $ix
    | if $ix 
      then .[$ix]["release"] = "2.0" 
      else . + [{name: "release", value: "2.0"}]
      end

但是它要么在空文件上失败。或者不创建新条目。 我在这里迷路了。

json jq
2个回答
0
投票
jq --arg release 2.2 '.environments += [{"name":"prod","release":$release}]
                      | del(.environments[]
                            | select(.name == "prod" and .release != $release))' file.json

在以下 4 个文件上进行测试:

echo '{}' > 1.in
echo '{"environments":[]}' > 2.in
echo '{"environments":[{"name":"test","release":"2.0"}]}' > 3.in
echo '{"environments":[{"name":"test","release":"2.0"},{"name":"prod","release":"1.0"}]}' > 4.in

0
投票

您可以创建一个

INDEX
,然后更新
.prod
字段。这样,如果存在,则更新它;如果不存在,则创建它。然后,迭代项目以恢复数组。初始
nulls = []
负责处理第一个空对象情况。

.environments |= [(nulls = [] | INDEX(.name) | .prod = {name: "prod", release: "2.0"})[]]
© www.soinside.com 2019 - 2024. All rights reserved.