如何使用jq命令向JSON对象中添加字段?

29
{"name":"John","age":30,"city":"New York"}

我有这个JSON数据:

{
    "success": true,
    "module": {
        "data": {
            "item_i77f664a2": {
                "id": "i77f664a2",
                "tag": "item",
                "fields": {
                    "cartItemId": 2012636322
                },
                "type": "biz"
            }
        }
    }
}

我希望在cartItemId下面添加{"operation":"delete"},然后将JSON数据保存到文件中。我想要的结果是这样的:

{"cartItem": {"itemId": 12345,"quantity": 1,"operation": "delete"}}
{
    "success": true,
    "module": {
        "data": {
            "item_i77f664a2": {
                "id": "i77f664a2",
                "tag": "item",
                "fields": {
                    "cartItemId": 2012636322,
                    "operation": "delete"
                },
                "type": "biz"
            }
        }
    }
}

这是我尝试过的:

jq '.module.data.item_i77f664a2.fields + {"operation":"delete"}' > data.json

但它并没有保存我想要的输出JSON数据。我该如何解决?

2个回答

39
这种更新类型中,+= 的神奇之处得以展现。通过您的输入,以下调用将实现:
jq '.module.data.item_i77f664a2.fields += {"operation":"delete"}'

生成您指定的输出:

{
  "success": true,
  "module": {
    "data": {
      "item_i77f664a2": {
        "id": "i77f664a2",
        "tag": "item",
        "fields": {
          "cartItemId": 2012636322,
          "operation": "delete"
        },
        "type": "biz"
      }
    }
  }
}

然而,我不确定这会在类似情况下产生你想要的结果,因为你引用了“item_i77f61ee2”。


1
这个是在末尾添加,如何将它插入到开头而不是末尾? - karthik101
1
@karthik101 - '.module.data.item_i77f664a2.fields |= [{"operation":"delete"}] + .' - peak
@peak 那不会把两个合并吗?你能具体指定“在 cartItemId 属性之后添加这个新属性吗?(例如,假设有多个 fields 而不仅仅是一个。 - Josh M.
@JoshM - +是多态的:它既可以用于合并对象,也可以用于连接数组等。如果这不能回答你的问题,或许你想要提一个新的SO问题... - peak

6
感谢@peak提供的答案!
补充一点,
创建一个空的JSON文件:
echo "{}" > config.json

文件内容:

{}

然后在文件中添加属性:

echo "$(jq '. += {"url": "https://url.com"}' config.json)" > config.json

文件内容:

{
    "url": "https://url.com"
}

另外一个属性:

echo "$(jq '. += {"name": "a Name"}' config.json)" > config.json

文件内容:

{
    "url": "https://url.com",
    "name": "a Name"
}

如果您已经设置了变量并希望使用该值(例如 Azure 构建管道),则可以将该值作为参数传递(在此示例中为urlarg):
URL="https://url.com"
echo "$(jq --arg urlarg "$URL" '. += {"url": $urlarg}' config.json)" > config.json

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接