使用 jq 进行条件 JSON 转换

使用 jq 进行条件 JSON 转换

我有一个系统,可以输出多种类型的带有数据的 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和 设置colourorange

{
    "name": "Paul",
    "country": "USA",
    "spec": {
        ...
        "asset": {
            "house": false,
            "colour": "black"
        },        
    }    
}

期望的输出:

{
    "name": "Paul",
    "country": "USA",
    "spec": {
        ...
        "asset": {
            "house": true,
            "colour": "orange"
        },        
    }    
}

答案1

下面的代码将命令行中的颜色作为字符串使用--arg,并使用布尔值--argjson(因为它不是字符串)。然后它无条件地将内部的colourhouse键设置.spec.asset为这些给定值。如果.spec.asset输入文档中不存在,则创建它。

jq --arg colour orange --argjson house true '.spec.asset += $ARGS.named' input.json

$ARGS.namedin 中的变量是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"
    }
  }
}

相关内容