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

API获取节点数据后无法通过JSON键索引取值的问题排查

问题排查:JSON键索引触发TypeError错误

问题场景

从API获取两组参数结构相同的字节类型列表数据,转换后尝试通过print(son['aNodeName'])键索引取值时,触发TypeError: string indices must be integers错误。

原始数据

raw_data = [b'[{"aNodeName": "nodeA","aPortName": "portB"}, {"aNodeName": "nodeC","aPortName": "portD"}]', 
        b'[{"aNodeName": "nodeX","aPortName": "portY"}, {"aNodeName": "nodeZ","aPortName": "portQ"}]' ]

原处理代码

data_json = []
for w in raw_data:
    data_change = w.decode('utf8').replace("'", '"')
    data_json.append(data_change)

import json
for e in data_json:
    don = json.loads(e)
    son = json.dumps(don, indent=4, sort_keys=True)
    print(son)

错误根源

核心问题是混淆了json.loads()和json.dumps()的作用:

  • json.loads(e):将JSON字符串解析为Python可操作的列表/字典对象,这是能通过键/索引访问值的对象
  • json.dumps(don, ...):将Python对象序列化为格式化的JSON字符串,用于输出或存储,字符串类型无法用键索引

你代码中的son是json.dumps()返回的字符串,自然会触发"字符串索引必须是整数"的错误。

修正后的代码

raw_data = [b'[{"aNodeName": "nodeA","aPortName": "portB"}, {"aNodeName": "nodeC","aPortName": "portD"}]', 
        b'[{"aNodeName": "nodeX","aPortName": "portY"}, {"aNodeName": "nodeZ","aPortName": "portQ"}]' ]

import json
for byte_data in raw_data:
    # 解码字节串为字符串,原始数据无单引号,无需replace操作
    json_str = byte_data.decode('utf8')
    # 解析为Python列表(内部是字典)
    data_objects = json.loads(json_str)
    # 遍历每个节点数据,通过键索引取值
    for item in data_objects:
        print(f"节点名称:{item['aNodeName']}")
        # 如需格式化输出JSON字符串,单独处理
        print(json.dumps(item, indent=4, sort_keys=True))

关键修正点

  1. 直接处理原始字节数据,省去中间字符串列表的存储,简化流程
  2. 保留json.loads()返回的Python对象(列表/字典)作为操作主体,这才是支持键索引的对象
  3. 移除多余的replace("'", '"'):原始数据本身使用双引号,该操作无意义
  4. 如需格式化输出JSON,仅在需要打印/存储时使用json.dumps(),不要将结果赋值给要进行键索引的变量

内容的提问来源于stack exchange,提问作者Az S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:25:30