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

遍历JSON数组首条后报'str' object has no attribute 'get'错误

问题根因

该报错的本质是待遍历的数组在循环执行过程中被污染,混入了字符串类型元素,结合你描述的“第一条字典处理完成后开始遍历AuditorId等字典键名”的特征,对应两类最高发的编码错误:

  1. 代码缩进错误:原本用于解析单条字典字段的内层循环,缩进层级和外层遍历数组的循环对齐,导致外层遍历完第一条字典元素后,循环变量直接被赋值为该字典的遍历结果——Python中直接遍历字典默认返回字符串类型的键名,后续对字符串类型的循环变量调用.get()就会触发报错。
  2. 遍历过程中非法修改原列表:处理第一条数据时,误执行了待遍历列表.extend(当前字典对象)这类操作。字典本身是可迭代对象,extend会把字典的所有字符串键逐个追加到原列表末尾,遍历完第一条字典后,就会逐个遍历后续追加的字符串键。
排查与修复步骤
  • 先做定位验证:在循环最开头打印type(当前循环变量)、len(待遍历列表),如果第二轮循环开始时循环变量类型变为str,且待遍历列表长度比前端传入的原始长度长,即可实锤是列表被污染。
  • 检查代码缩进:所有处理单条字典内部字段的逻辑,必须嵌套在外层for item in 目标数组的代码块内,禁止把遍历字典字段的循环写到外层层级。
    典型错误缩进写法:
    # views.py 错误示例
    audit_records = request.data["records"]
    for item in audit_records:
        # 这部分调用存储过程的逻辑本身没问题
        params = (item.get("AuditorId"), item.get("AuditResult"), item.get("Comment"))
        cursor.callproc("sp_SaveAuditResponse", params)
        db.commit()
    # 此处缩进退到和外层for同级,属于严重错误
    # 此时item仍指向最后一次循环拿到的字典对象,for k in item会直接遍历字典的键
    for k in item:
        print(k) # 控制台就会输出AuditorId这类字符串
        val = k.get("xxx") # 对字符串k调用.get()直接触发报错
    
    修复方式很简单,把内层处理字段的逻辑全部缩进,归到外层数组遍历的代码块内即可。
  • 检查列表修改逻辑:遍历原数组的过程中,绝对不要对原数组执行append、extend、insert这类增删改操作。如果需要暂存处理结果,单独新建一个空列表存储,不要改动待遍历的原列表。
    典型的污染列表示例:
    audit_records = request.data["records"]
    for item in audit_records:
        # 错误操作:将字典extend进原列表,会把字典所有字符串键追加到列表末尾
        audit_records.extend(item)
        # 等遍历到追加的字符串元素时,调用.get()直接报错
        res = item.get("AuditId")
    
  • 兜底检查参数解析:如果前端传的是序列化后的JSON字符串,必须先用json.loads()解析为Python原生列表对象后再遍历,禁止直接遍历字符串(直接遍历字符串会逐个返回单个字符,也会触发同类报错,但你场景中第一条数据能正常处理,该问题概率极低)。
验证标准

修复后在循环开头打印所有循环变量的类型,确认全部为dict类型,无str类型元素混入,再执行存储过程调用就不会复现该报错。

内容的提问来源于stack exchange,提问作者kelvin003

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:21:20