我想向 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
两种方式:
提供要添加或更改的显式键的路径并分配其值。
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
添加了新的键+值,没有其他内容(您会丢失其他顶级键)。
第二次尝试的问题(本质上. + { "object": { "key": "value" } }
)是您object
向顶级对象添加了一个新键,覆盖了旧值。