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

使用jq过滤JSON时遭遇Cannot index string with string 'key'错误求助

问题解决方法

错误原因分析

  1. JSON语法错误:你提供的JSON片段是多个独立对象用逗号分隔,但没有包裹在数组[]中,且最后一个对象末尾多了逗号,这直接导致jq解析失败。
  2. jq查询逻辑错误:你使用的map(select(.key == "WEIGHT_BODYFAT_BROAD"))是在顶层对象中查找key字段,但key实际嵌套在每个记录的samplePoints数组子元素里,顶层对象没有该字段,因此触发索引错误。

步骤1:修复JSON语法

将所有对象包裹在数组中,并移除最后一个对象后的逗号,修正后的JSON结构如下:

[
  {
    "timeZone": "+0200",
    "deviceCode": 202590286,
    "type": 8,
    "version": 1622385523034,
    "recordId": "TkgTDAAAAAAIAAAArF62vXkBAAA=",
    "dataId": 0,
    "healthDataSource": 0,
    "appType": 1,
    "startTime": 1622385516204,
    "endTime": 1622385516204,
    "samplePoints": [
      {
        "mergedFlag": 0,
        "unit": "0",
        "startTime": 1622385516204,
        "endTime": 1622385516204,
        "value": "{\"age\":29,\"basalMetabolism\":2266.0,\"bmi\":34.0,\"bodyAge\":38,\"bodyFatRate\":33.20000076293945,\"bodyScore\":67.0,\"bodySize\":5,\"bodyWeight\":115.19999694824219,\"boneSalt\":3.989405632019043,\"extendAttribute\":\"0\",\"gender\":1,\"heartRate\":84,\"height\":184,\"moisture\":51.61684036254883,\"moistureRate\":44.8062858581543,\"muscleMass\":72.9608154296875,\"pole\":1,\"proteinRate\":21.34735107421875,\"skeletalMusclelMass\":42.30829620361328,\"visceralFatLevel\":20.0}",
        "key": "WEIGHT_BODYFAT_BROAD"
      }
    ]
  },
  {
    "timeZone": "+0200",
    "deviceCode": 202576998,
    "type": 7,
    "version": 1622408526036,
    "recordId": "ZhQTDAAAAAAHAAAAIAvJvXkBAAA=",
    "dataId": 0,
    "healthDataSource": 0,
    "appType": 1,
    "startTime": 1622386740000,
    "endTime": 1622386800000,
    "samplePoints": [
      {
        "mergedFlag": 0,
        "unit": "0",
        "startTime": 1622386740000,
        "endTime": 1622386800000,
        "value": "78.0",
        "key": "DATA_POINT_DYNAMIC_HEARTRATE"
      }
    ]
  },
  {
    "timeZone": "+0800",
    "deviceCode": 202590286,
    "type": 8,
    "version": 1622615424878,
    "recordId": "TkgTDAAAAAAIAAAAAHxqy3kBAAA=",
    "dataId": 0,
    "healthDataSource": 0,
    "appType": 1,
    "startTime": 1622615424000,
    "endTime": 1622615424000,
    "samplePoints": [
      {
        "mergedFlag": 0,
        "startTime": 1622615424000,
        "endTime": 1622615424000,
        "value": "{\"age\":29,\"bodyWeight\":114.3,\"extendAttribute\":\"0\",\"gender\":1,\"height\":184,\"pole\":1,\"weightDivision\":2}",
        "key": "WEIGHT_BODYFAT_BROAD"
      }
    ]
  }
]

步骤2:使用正确的jq查询

根据你的需求选择对应的语句:

需求1:筛选包含WEIGHT_BODYFAT_BROAD采样点的整条记录

jq 'map(select(.samplePoints[]?.key == "WEIGHT_BODYFAT_BROAD"))' your-file.json
  • samplePoints[]?遍历每个记录的采样点数组,?避免空数组引发报错
  • 筛选出至少包含一个目标采样点的整条记录

需求2:仅提取WEIGHT_BODYFAT_BROAD类型的采样点数据

jq '.[].samplePoints[] | select(.key == "WEIGHT_BODYFAT_BROAD")' your-file.json
  • 先遍历顶层数组的所有记录,再遍历每个记录的采样点,最终筛选出匹配的采样点元素

内容的提问来源于stack exchange,提问作者plaidshirt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 11:22:12