如何使用JQ将键值对添加到JSON文件中?

如何使用JQ将键值对添加到JSON文件中?

我有以下 JSON 文件,位于/tmp/target.json

{
  "compileOnSave": false,
  "compilerOptions": {
    "baseUrl": "./",
    ...
  }
}

我想添加一个新的键值对,如下所示:

{
  "compileOnSave": false,
  "compilerOptions": {
    "skipLibCheck": true,
    "baseUrl": "./",
    ...
  }
}

我使用以下命令但它不起作用:

jq --argjson addobj '{"skipLibCheck": "true"}' '
  .compilerOptions{} |= $addobj
' /tmp/target.json

我给了我这个错误:

jq: error: syntax error, unexpected '{', expecting $end (Unix shell quoting issues?) at <top-level>, line 2:
  .compilerOptions{} |= $addobj                  
jq: 1 compile error

我做错了什么?我怎样才能让它按预期工作?

答案1

像这样:

$ jq '.compilerOptions.skipLibCheck=true' file.json
{
  "compileOnSave": false,
  "compilerOptions": {
    "baseUrl": "./",
    "skipLibCheck": true
  }
}

答案2

已经介绍了添加键及其值的最简单方法在另一个答案中。该答案将键添加到对象中键列表的末尾compilerOptions。通常,键的顺序并不重要,如果您需要以特定方式排序,则可以使用大批。但是,我注意到您(无论出于何种原因)希望在现有密钥之前首先添加密钥baseUrl

我们可以将键添加到该位置,而不是将新键添加到现有对象,而是将现有对象的键添加到新键的末尾。因此,鉴于现有的 JSON 文档,

{
  "compileOnSave": false,
  "compilerOptions": {
    "baseUrl": "./",
    "jerry": "Was a race car driver"
  }
}

...我们可能想使用

jq --argjson skipLibCheck true '.compilerOptions = $ARGS.named + .compilerOptions' file

鉴于我们上面的示例文档,这将生成

{
  "compileOnSave": false,
  "compilerOptions": {
    "skipLibCheck": true,
    "baseUrl": "./",
    "jerry": "Was a race car driver"
  }
}

事物是一个对象,其中包含在命令行上使用和/或$ARGS.named定义的键值对。在上面的示例中,这将是.请注意,该功能是在 1.5 版本之后引入的。--arg--argjson{"skipLibCheck":true}$ARGSjq

对于旧版 1.5 版本jq,您可以使用

jq --argjson skipLibCheck true '.compilerOptions = { skipLibCheck: $skipLibCheck } + .compilerOptions' file

如果您希望该值是字符串而不是特殊的布尔值,请使用--arg代替。--argjsontruetrue

下面给出了另一种添加密钥的方法结尾(其他答案中提到的内容),它遵循与上述命令相同的模式。请注意,我还切换到使用此处作为字符串--arg插入,只是为了展示其外观。true

jq --arg skipLibCheck true '.compilerOptions += $ARGS.named' file

...这会给你

{
  "compileOnSave": false,
  "compilerOptions": {
    "baseUrl": "./",
    "jerry": "Was a race car driver",
    "skipLibCheck": "true"
  }
}

对于旧版 1.5 版本jq,您可以使用

jq --arg skipLibCheck true '.compilerOptions += { skipLibCheck: $skipLibCheck }' file

相关内容