如何用jq将同一条目字段值复制到另一字段并保留顶层输出?
在jq中将数组条目内的字段值复制到同一条目的另一个字段
给定输入JSON:
{ "items": [ { "name": "first" }, { "name": "second" } ] }
需要实现的效果是:为items数组中的每个对象新增value字段,其值与同对象的name字段一致,期望输出:
{ "items": [ { "name": "first", "value": "first" }, { "name": "second", "value": "second" } ] }
静态值赋值(如jq '.items[].value |= "x"')可以正常修改,但动态复制同条目字段值时,要么出现value为null的上下文错误,要么输出仅单个条目而非完整顶层结构。
解决方案
方法一:对象合并写法
使用|=锁定数组元素的修改上下文,通过对象合并新增字段:
jq '.items[] |= . + {value: .name}' input.json
.items[]定位到数组中的每个元素|=表示将修改后的元素替换回原数组位置,保证顶层JSON结构完整. + {value: .name}将当前元素(.指代)与包含value字段的新对象合并,自动保留原有name字段
方法二:直接字段赋值写法
更简洁的直接赋值方式,同样利用|=锁定上下文:
jq '.items[] |= (.value = .name)' input.json
括号确保.value = .name操作的上下文是当前数组元素,.正确指向元素内的name字段,赋值后原元素结构被保留并替换回数组。
错误原因说明
- 若直接使用
jq '.items[].value = .name',赋值时.的上下文会跳转到顶层JSON(而非数组元素),顶层不存在name字段,导致value被设为null - 若错误使用
jq '.items[] | .value = .name',则会只输出修改后的单个元素,丢失顶层的items结构
内容的提问来源于stack exchange,提问作者kojiro
相关产品推荐
相关产品推荐

