データと共に複数のタイプのJSONファイルを出力するシステムがあります。
次の3つの条件を達成するために使用する機会がありますかjq
?map()
コマンドと--arg
コマンドラインオプションを見ていますが、--argjson
詰まっています。
最初のJSON、オブジェクトがあり、asset
次のキーと値のペアを追加したいと思います。
"house": true と "color": "オレンジ"
{
"name": "Paul",
"country": "USA",
"spec": {
...
"asset": {
"yard": true
},
}
}
希望の出力:
{
"name": "Paul",
"country": "USA",
"spec": {
...
"asset": {
"house": true,
"colour": "orange",
"yard": true
},
}
}
2番目のJSON、オブジェクトがないので、asset
オブジェクトと次のキー値のペアを追加したいと思います。
"house": true と "color": "オレンジ"
{
"name": "Paul",
"country": "USA",
"spec": {
...
}
}
希望の出力:
{
"name": "Paul",
"country": "USA",
"spec": {
...
"asset": {
"house": true,
"colour": "orange"
},
}
}
3番目のJSON、オブジェクトがありますが、対応するキーと値のペアが次に設定されているかどうかをasset
変更したいと思います。house
false
colour
orange
{
"name": "Paul",
"country": "USA",
"spec": {
...
"asset": {
"house": false,
"colour": "black"
},
}
}
希望の出力:
{
"name": "Paul",
"country": "USA",
"spec": {
...
"asset": {
"house": true,
"colour": "orange"
},
}
}
ベストアンサー1
以下のコードはコマンドラインから色を文字列として取り、ブール--arg
値を使用します--argjson
(文字列ではないため)。次に、無条件に内部colour
合計house
キーを.spec.asset
指定された値に設定します。.spec.asset
入力文書にない場合は作成してください。
jq --arg colour orange --argjson house true '.spec.asset += $ARGS.named' input.json
$ARGS.named
inの変数は、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"
}
}
}