Python解析列表字典混合嵌套JSON报TypeError的取值方案
报错原因
TypeError: list indices must be integers or slices, not str 由取值方式和数据结构不匹配导致:你提供的JSON中data、rows、dimensions、metrics字段的值均为列表类型,列表仅支持整数索引、切片取值,无法直接传入字符串键访问。
原代码中itemlist['data']['rows']的写法,是在对itemlist['data']这个列表直接用'rows'字符串键取值,因此触发报错。
正确解析方法
先明确示例JSON的层级对应关系:
- 最外层是字典,取
data字段得到列表,取列表第0个元素,才能拿到带rows字段的字典 - 取
rows字段得到列表,取列表第0个元素,才能拿到带dimensions、metrics字段的字典 - 再从两个字段对应的列表中,按索引取目标值即可
针对你给出的示例数据,直接取值的代码如下:
import json itemlist = json.loads(r.text) # 逐层穿透列表层拿到目标行数据 row_content = itemlist['data'][0]['rows'][0] # 提取dimensions下的title1 title_val = row_content['dimensions'][0]['value'] print(repr(title_val)) # 提取metrics下索引为3的123123 num_val = row_content['metrics'][3]['value'] print(repr(num_val))
运行后输出完全符合预期:
'title1' '123123'
如果实际业务场景中data、rows下有多条数据,不是单条,可以加循环遍历所有列表元素,避免硬编码索引导致的取值错误,参考写法:
import json itemlist = json.loads(r.text) for data_block in itemlist['data']: for row_block in data_block['rows']: # 遍历提取维度值 for dim_item in row_block['dimensions']: if 'value' in dim_item: print(repr(dim_item['value'])) # 遍历提取指标值,可根据业务规则加判断筛选目标值 for metric_item in row_block['metrics']: if 'value' in metric_item and metric_item['value'] == '123123': print(repr(metric_item['value']))
内容的提问来源于stack exchange,提问作者pozuhtuhv
相关产品推荐
相关产品推荐

