jqのサブセクションにキーを追加する方法はありますか?

jqのサブセクションにキーを追加する方法はありますか?

jsonテキストに値を追加したいが、jq '.jq_path +{"key":"value"}'その部分だけが出力され、jq '. +{jq_path:{"key":"value"}}'パスが指す部分に作成されたすべての内容が置き換えられます(ここではjq_pathで説明されています)。

入力する

{
"object":{
"key1":"value1",
"key2":"value2"
},
"key3":"value3"
}

予想出力:

{
"object":{
"key1":"value1",
"key2":"value2",
"key":"value"
},
"key3":"value3"
}

私が得たものjq '. +{"object":{"key":"value"}}'

{
"object":{
"key":"value"
},
"key3":"value3"
}

私に適した次の解決策を見つけました。

function json_add_value(){
    input=$(</dev/stdin); jq_path=$1; jq_addition=$2
    
    jq_section=$(echo $input | jq "$jq_path +{$jq_addition}" | sed -e '1d' -e '$d')
    
    echo $input | jq "$jq_path ={$jq_section}"
}
# syntax
cat $json_file | json_add_value ".jq_path" '"key":"value"'

しかし、私はもっと正式な方法を使いたいです(最大のjqのみを使用してください)。どうすればいいですか?

答え1

2つの方法:

  1. 追加または変更する明示的なキーへのパスを提供し、その値を割り当てます。

    jq '.object.key = "value"' file
    
  2. +=パスにオブジェクトを「追加」するために使用されます.object。指定されたキーがすでに存在する場合、その.object値は新しい値で更新されます。

    jq '.object += { "key": "value" }' file
    

各ケースの結果は同じです。

{
  "object": {
    "key1": "value1",
    "key2": "value2",
    "key": "value"
  },
  "key3": "value3"
}

最初の試みの問題は、(本質的に.object + { "key": "value" })オブジェクトを抽出してオブジェクトに追加することです。この操作の結果、.object新しいキー+値が追加され、他のものは追加されません(他の最上位キーは失われます)。

2番目の試みの問題は、(デフォルトでは. + { "object": { "key": "value" } }object最上位オブジェクトに新しいキーを追加して古い値を上書きすることです。

関連情報