次の場所に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