JQを使用してJSONファイルにKey-Valueペアを追加するには?

JQを使用してJSONファイルにKey-Valueペアを追加するには?

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

関連情報