使用jq处理JSON时出现“Cannot index string with string 'version'”错误求助
jq命令报错与null输出的原因解析
问题场景
给定JSON数据:
{ "product": [ { "versions": "1.0", "components": [ { "name": "JVM", "version": "11.0.16" }, { "name": "TOMCAT", "version": "9.0.56" } ] }, { "versions": "1.1", "components": [ { "name": "JVM", "version": "11.0.16" }, { "name": "TOMCAT", "version": "9.0.56" } ] } ] }
执行以下命令时触发报错:
jq -r '.product[] | .versions, .components[] | "\(.name): \(.version)"' version_mapper.json
错误信息:
jq: error (at version_mapper.json:29): Cannot index string with string "version"
将命令中的.versions替换为.wrongKey后:
jq -r '.product[] | .wrongKey, .components[] | "\(.name): \(.version)"' version_mapper.json
输出结果:
null: null JVM: 11.0.16 TOMCAT: 9.0.56 null: null JVM: 11.0.16 TOMCAT: 9.0.56
原因解析
1. 原命令报错的核心原因
jq的管道会逐个处理上游输出的每一个值:
.product[]遍历product数组的两个元素,每个元素进入后续管道。- 对每个product元素,
.versions, .components[]会生成两个序列:首先是versions字段的字符串值(如"1.0"),然后是components数组的两个对象。 - 后续的
"\(.name): \(.version)"尝试从每个值中提取name和version:- 处理
components对象时,对象本身包含这两个字段,能正常输出; - 处理
versions的字符串值时,字符串属于不可索引类型,无法用.name或.version取值,直接触发报错中断执行。
- 处理
2. 替换为.wrongKey输出null: null的原因
- jq访问不存在的字段时,不会报错,而是返回
null值。 - 当后续格式化字符串处理
null值时,提取不存在的name和version字段会得到null,拼接后就变成null: null。 - 之后处理
components[]的对象时,依然能正常提取字段生成正确输出,所以最终结果会交替出现null: null和组件版本信息。
可选修正方案
如果需要同时输出产品版本和组件版本,可以分开处理两种数据:
jq -r '.product[] | "\(.versions): 产品版本", (.components[] | "\(.name): \(.version)")' version_mapper.json
输出结果:
1.0: 产品版本 JVM: 11.0.16 TOMCAT: 9.0.56 1.1: 产品版本 JVM: 11.0.16 TOMCAT: 9.0.56
内容的提问来源于stack exchange,提问作者R D
相关产品推荐
相关产品推荐

