如何使用jq基于现有字段生成复合字段extra?
问题:给JSON中issues的子对象添加组合字段extra
场景与需求
给定如下JSON数据:
$ DATA='{ "url": "https::/abc/", "issues": { "1": { "number": 1}, "2": {"number": 2 } } }' $ echo $DATA | jq . { "url": "https::/abc/", "issues": { "1": { "number": 1 }, "2": { "number": 2 } } }
需要给issues对象下的每个子对象添加名为extra的字段,其值为根对象的.url字段与子对象的.number字段拼接结果,预期输出:
{ "url": "https::/abc/", "issues": { "1": { "number": 1, "extra": "https::/abc/1" }, "2": { "number": 2, "extra": "https::/abc/2" } } }
尝试过程中的问题
- 仅引用
.url时可以正常赋值,但添加.number后返回null:
$ echo $DATA | jq '.url as $URL | .issues[] += { "extra" : "\( $URL )\( .number )" } ' { "url": "https::/abc/", "issues": { "1": { "number": 1, "extra": "https::/abc/null" }, "2": { "number": 2, "extra": "https::/abc/null" } } }
- 尝试存储
.number到变量时出现语法错误:
$ echo $DATA | jq '.url as $URL | .issues[].number as $NUM += { "extra" : "\( $URL )\( $NUM )" } ' jq: error: syntax error, unexpected +=, expecting '|' (Unix shell quoting issues?) at <top-level>, line 1: .url as $URL | .issues[].number as $NUM += { "extra" : "\( $URL )\( $NUM )" } jq: 1 compile error
解决方案
问题根源
使用+=时,操作的上下文是根对象,而非issues的子对象,因此.number无法定位到子对象的对应字段,返回null。需要切换到子对象的上下文进行字段添加操作。
正确命令
写法一(字符串插值)
echo $DATA | jq '.url as $URL | .issues[] |= . + { extra: "\($URL)\(.number)" }'
写法二(显式字符串拼接)
echo $DATA | jq '.url as $URL | .issues[] |= ( . + { extra: $URL + (.number | tostring) } )'
命令解释
|=:更新操作符,针对.issues[]遍历到的每个子对象进行操作,此时上下文切换为子对象本身,.number可正确获取值。. + { extra: ... }:将新字段合并到当前子对象中,保留原有字段。- 写法二中的
(.number | tostring):显式将数字类型的.number转换为字符串,避免类型拼接问题(jq字符串插值会自动转换,显式转换更严谨)。
执行结果
{ "url": "https::/abc/", "issues": { "1": { "number": 1, "extra": "https::/abc/1" }, "2": { "number": 2, "extra": "https::/abc/2" } } }
内容的提问来源于stack exchange,提问作者pmqs
相关产品推荐
相关产品推荐

