使用jq过滤JSON时遭遇Cannot index string with string 'key'错误求助
问题解决方法
错误原因分析
- JSON语法错误:你提供的JSON片段是多个独立对象用逗号分隔,但没有包裹在数组
[]中,且最后一个对象末尾多了逗号,这直接导致jq解析失败。 - 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
相关产品推荐
相关产品推荐

