jqを使用した条件付きJSON変換

jqを使用した条件付きJSON変換

データと共に複数のタイプのJSONファイルを出力するシステムがあります。

次の3つの条件を達成するために使用する機会がありますかjqmap()コマンドと--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変更したいと思います。housefalsecolourorange

{
    "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.namedinの変数は、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"
    }
  }
}

おすすめ記事