You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:11:27