我有一个系统,可以输出多种类型的带有数据的 JSON 文件。
是否有机会使用 来实现以下三个条件jq
?我正在探索map()
命令以及--arg
命令--argjson
行选项,但我遇到了困难。
第一个 JSON,我有一个asset
对象,我想添加以下键值对:
“房子”:真实和“颜色”:“橙色”
{
"name": "Paul",
"country": "USA",
"spec": {
...
"asset": {
"yard": true
},
}
}
期望的输出:
{
"name": "Paul",
"country": "USA",
"spec": {
...
"asset": {
"house": true,
"colour": "orange",
"yard": true
},
}
}
第二个 JSON,我没有对象asset
,所以我想添加对象和以下键值对
“房子”:真实和“颜色”:“橙色”
{
"name": "Paul",
"country": "USA",
"spec": {
...
}
}
期望的输出:
{
"name": "Paul",
"country": "USA",
"spec": {
...
"asset": {
"house": true,
"colour": "orange"
},
}
}
第三个 JSON,其中我有一个asset
对象,但我想更改它的键值对house
是否设置为false
和 设置colour
为orange
:
{
"name": "Paul",
"country": "USA",
"spec": {
...
"asset": {
"house": false,
"colour": "black"
},
}
}
期望的输出:
{
"name": "Paul",
"country": "USA",
"spec": {
...
"asset": {
"house": true,
"colour": "orange"
},
}
}
答案1
下面的代码将命令行中的颜色作为字符串使用--arg
,并使用布尔值--argjson
(因为它不是字符串)。然后它无条件地将内部的colour
和house
键设置.spec.asset
为这些给定值。如果.spec.asset
输入文档中不存在,则创建它。
jq --arg colour orange --argjson house true '.spec.asset += $ARGS.named' input.json
$ARGS.named
in 中的变量是jq
一个对象,其中包含作为键的命名参数,以及作为值的给定参数。在上面的例子中,$ARGS.named
相当于
{"colour":"orange","house":true}
将其添加到+=
我们要修改的文档部分会产生添加该部分的给定键和值的效果,覆盖已经存在的键。
对每个输入文件运行命令:
$ jq . -c file1
{"name":"Paul","country":"USA","spec":{"asset":{"yard":true}}}
$ jq --arg colour orange --argjson house true '.spec.asset += $ARGS.named' file1
{
"name": "Paul",
"country": "USA",
"spec": {
"asset": {
"yard": true,
"colour": "orange",
"house": true
}
}
}
$ jq . -c file2
{"name":"Paul","country":"USA","spec":{}}
$ jq --arg colour orange --argjson house true '.spec.asset += $ARGS.named' file2
{
"name": "Paul",
"country": "USA",
"spec": {
"asset": {
"colour": "orange",
"house": true
}
}
}
$ jq . -c file3
{"name":"Paul","country":"USA","spec":{"asset":{"house":false,"colour":"black"}}}
$ jq --arg colour orange --argjson house true '.spec.asset += $ARGS.named' file3
{
"name": "Paul",
"country": "USA",
"spec": {
"asset": {
"house": true,
"colour": "orange"
}
}
}