Python解析JSON报TypeError:list indices must be integers or slices错误解决
错误产生原因
触发TypeError: list indices must be integers or slices, not str的直接原因是:你的取值路径中某一层返回的数据类型是列表(list),而非你预期的字典(dict)。字符串类型的key只能用来索引字典,索引列表必须使用整数下标或切片,直接传字符串key就会抛出该错误。
你写的长链式取值默认路径上每一级都是字典结构,但实际接口返回的JSON结构里,challengeMethods/challenges/requiredMethods/versions这类字段通常是数组结构,哪怕数组仅包含1个元素,也需要先通过下标取出对应元素,才能继续用key取内部字段。
快速定位问题层级
逐层打印每一步取值的返回类型,就能精准找到哪一层是列表,排查代码如下:
result2 = response2.json() # 从最外层开始逐段执行,每一步打印类型 current = result2 print("根节点类型:", type(current)) current = current['challengeMethods'] print("challengeMethods层类型:", type(current)) current = current['challenges'] # 如果上一层是list,这里就会先报错,对应调整即可 print("challenges层类型:", type(current)) # 按照这个逻辑依次往下检查requiredMethods、versions层即可
正确取值方案
固定下标快速取值(确认目标值在列表第一个元素时用)
如果排查确认目标值所在的列表元素固定在第一位,直接在列表层加[0]索引即可:
result2 = response2.json() # 以下为该类接口常见结构的取值写法,可根据你实际排查到的列表位置调整[0]的位置 reference_id_approve = result2['challengeMethods'][0]['challenges'][0]['requiredMethods'][0]['versions'][0]['referenceId']
遍历匹配稳妥取值(不确定元素位置时用)
如果列表内元素顺序不固定,建议逐层遍历匹配目标值,避免下标错误导致取错值或抛错:
reference_id_approve = None target_ref = "14fee7f5-2f81-448c-a0ca-41558eb68b8f:P6JQ" for cm in result2.get('challengeMethods', []): challenges = cm.get('challenges', []) if isinstance(cm, dict) else [] for ch in challenges: req_methods = ch.get('requiredMethods', []) if isinstance(ch, dict) else [] for rm in req_methods: versions = rm.get('versions', []) if isinstance(rm, dict) else [] for ver in versions: if isinstance(ver, dict) and ver.get('referenceId') == target_ref: reference_id_approve = ver['referenceId'] break if reference_id_approve: break if reference_id_approve: break if reference_id_approve: break
提示:写接口取值逻辑时尽量用
dict.get()方法代替直接[]索引,可以避免字段缺失时直接抛出KeyError。
内容的提问来源于stack exchange,提问作者Dynamic
相关产品推荐
相关产品推荐

