使用jq替换JSON字段值报错:Cannot index string with string "fields"
问题分析与解决
错误原因
你写的jq命令通过管道|将JSON结构逐层展开,最终只针对fields数组里的单个字段对象进行操作,破坏了原JSON的层级结构,导致jq无法正确识别上下文里的fields字段;同时这种写法只会输出被修改的那个小对象,而非完整的修改后JSON结构。
正确写法
要保留原JSON结构并完成修改,有两种常用方式:
方式1:直接针对层级更新赋值
jq '.[].fields[] |= (select(.name == "body_t").value = "你的新值")' template.json
通过|=操作符,直接在原层级上对匹配字段进行修改,同时保留整个JSON结构。
方式2:用map遍历数组处理
jq 'map(.fields |= map(if .name == "body_t" then .value = "你的新值" else . end))' template.json
通过map分别遍历外层数组和fields数组,对匹配字段修改值,不匹配的保持原样,最终返回完整JSON结构。
示例验证
用你的模板JSON测试第一种命令(将新值设为NEW_CONTENT):
jq '.[].fields[] |= (select(.name == "body_t").value = "NEW_CONTENT")' template.json
会输出修改后的完整JSON:
[ { "fields": [ { "name": "body_t", "value": "NEW_CONTENT" } ], "id": "abc123" } ]
内容的提问来源于stack exchange,提问作者Terry Chambers - Onix
相关产品推荐
相关产品推荐

