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))
关键修正点
- 直接处理原始字节数据,省去中间字符串列表的存储,简化流程
- 保留
json.loads()返回的Python对象(列表/字典)作为操作主体,这才是支持键索引的对象 - 移除多余的
replace("'", '"'):原始数据本身使用双引号,该操作无意义 - 如需格式化输出JSON,仅在需要打印/存储时使用
json.dumps(),不要将结果赋值给要进行键索引的变量
内容的提问来源于stack exchange,提问作者Az S.
相关产品推荐
相关产品推荐

