无法加载含Unicode字符串的JSON数据,json.loads报错该如何解决?
解决JSON Unicode转义导致
json.loads()报错的问题 嘿,这个坑我之前踩过!当JSON里的内部字符串带Unicode转义格式(比如\uXXXX)但没被正确处理时,json.loads()确实会抛出错误。咱们根据常见情况一步步来解决:
情况1:字符串存在双重转义(最常见)
如果你的mystring是双重编码的结果——比如先把JSON对象转成字符串,又对这个字符串做了一次JSON编码,就会变成类似这样:
mystring = '"{\\"content\\": \\"\\\\u4F60\\\\u597D\\\\u4E16\\\\u754C\\"}"'
这时候直接用json.loads()只会得到一个字符串,而不是JSON对象。需要分两次解析:
import json # 第一步:解析外层,拿到原始的JSON字符串 raw_json_str = json.loads(mystring) # 第二步:解析内层,得到最终的JSON对象 data = json.loads(raw_json_str) print(data["content"]) # 输出:你好世界
情况2:Unicode转义序列不合法
如果报错提示类似Invalid \uXXXX escape,说明转义格式有问题:比如\u后面不足四位十六进制数,或者包含无效的Unicode码点。这时候可以用正则先修复:
import re import json def fix_bad_unicode_escapes(s): # 补全不完整的\u转义(比如把\u123改成\u0123) s = re.sub(r'\\u([0-9a-fA-F]{1,3})', lambda m: f'\\u{"0"*(4-len(m.group(1)))}{m.group(1)}', s) # 移除单独的无效代理字符(可选,根据需求调整) s = re.sub(r'\\uD[89AB][0-9a-fA-F]{2}', '', s) return s fixed_str = fix_bad_unicode_escapes(mystring) data = json.loads(fixed_str)
情况3:字符串是未解码的字节流
如果你的mystring其实是字节类型(比如从文件读取时没做解码),得先转成字符串再解析:
import json # 假设mystring是bytes类型,用对应编码解码(比如utf-8) decoded_str = mystring.decode('utf-8') data = json.loads(decoded_str)
终极小技巧:用ast.literal_eval()兜底
要是以上方法都不好使,可以试试用ast.literal_eval()先把字符串转成Python原生对象,再处理:
import ast import json # 先转成Python字典/列表 python_obj = ast.literal_eval(mystring) # 再转成JSON格式的对象 data = json.loads(json.dumps(python_obj))
内容的提问来源于stack exchange,提问作者Akshay Patil
相关产品推荐
相关产品推荐

