有没有办法向 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

两种方式:

  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添加了新的键+值,没有其他内容(您会丢失其他顶级键)。

第二次尝试的问题(本质上. + { "object": { "key": "value" } })是您object向顶级对象添加了一个新键,覆盖了旧值。

相关内容