Python调用json.loads报Extra data及str无get属性错误排查
JSON解析两类异常的触发原因与解决方案
异常1:直接调用json.loads报错 Extra data: line 1 column 177 (char 176)
触发原因
你提供的测试用例字符串本身是合法JSON结构,实际业务中触发该报错的核心原因是你传入的待解析字符串存在冗余内容:
- 字符串末尾存在未截断的不可见字符、空白符或者额外的JSON片段,刚好在第176字符位置后出现了不符合当前JSON结构的内容
- 多数情况该字符串来自二进制流、socket报文、固定长度缓冲区读取结果,读取时没有按照实际有效长度截断,保留了填充的冗余位
解决方法
- 先打印原始字符串的完整编码,确认冗余内容类型,优先清除空字符与空白符后再解析:
# 清除末尾空字符、换行、空格等冗余内容 cleaned_str = raw_json_str.rstrip('\x00\n\r ') parsed_result = json.loads(cleaned_str)
- 如果是多段JSON拼接的场景,按JSON结构边界切割后分段解析即可。
异常2:先dumps再loads后出现大量\u0000空字符、调用get方法报错'str' object has no attribute 'get'
触发原因
- 首先
json.dumps()是将Python对象序列化为JSON字符串的方法,你直接对已经是字符串类型的原始JSON内容调用dumps,会把整个字符串转义封装为新的JSON字符串,loads解析后得到的结果依然是字符串类型,并非字典,自然无法调用字典的get()方法 - 你看到的
\u0000是空字符的Unicode转义形式,只是原始字符串末尾的空字符经过dumps转义后被显式输出了,并不是dumps操作新增的内容
解决方法
删除多余的dumps步骤,直接对清洗后的原始字符串做解析即可:
# 错误写法(完全无意义的冗余操作) temp_str = json.dumps(raw_json_str) parsed_data = json.loads(temp_str) # 解析结果为字符串,无法调用get # 正确写法 cleaned_str = raw_json_str.rstrip('\x00') parsed_dict = json.loads(cleaned_str) # 此时parsed_dict为字典类型,可正常调用get方法 print(parsed_dict.get('data'))
内容的提问来源于stack exchange,提问作者ankur katiyar
相关产品推荐
相关产品推荐

