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つの方法:
追加または変更する明示的なキーへのパスを提供し、その値を割り当てます。
jq '.object.key = "value"' file
+=
パスにオブジェクトを「追加」するために使用されます.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
最上位オブジェクトに新しいキーを追加して古い値を上書きすることです。