![如何使用JQ将键值对添加到JSON文件中?](https://linux22.com/image/217092/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8JQ%E5%B0%86%E9%94%AE%E5%80%BC%E5%AF%B9%E6%B7%BB%E5%8A%A0%E5%88%B0JSON%E6%96%87%E4%BB%B6%E4%B8%AD%EF%BC%9F.png)
我有以下 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}
$ARGS
jq
对于旧版 1.5 版本jq
,您可以使用
jq --argjson skipLibCheck true '.compilerOptions = { skipLibCheck: $skipLibCheck } + .compilerOptions' file
如果您希望该值是字符串而不是特殊的布尔值,请使用--arg
代替。--argjson
true
true
下面给出了另一种添加密钥的方法结尾(其他答案中提到的内容),它遵循与上述命令相同的模式。请注意,我还切换到使用此处作为字符串--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