Python解析含特殊字符的JSON失败,如何转为原始字符串解析?
首先得明确一个关键点:Python里的原始字符串(r"")只是写代码时的语法糖,它并不是一种特殊的字符串类型——不管你用普通字面量还是原始字面量定义字符串,最终得到的字符串对象是完全一样的。所以不存在“让Python自动把字符串当作原始字符串处理”的说法,原始字符串只是帮你在写代码时避免手动转义反斜杠而已。
为什么用r""""包裹就能解析?
你遇到的情况,本质是当你把捕获到的JSON字符串直接作为普通字符串字面量写进代码时,Python会提前解析其中的转义字符(比如把\"变成"),导致传入json.loads()的字符串已经不是原始的、符合JSON规范的内容了。而用原始字面量的话,Python不会解析这些转义,所以传入的是正确的JSON格式,自然能成功解析。
但你是从HTTP请求捕获的字符串,运行时这个字符串已经是一个Python字符串对象了,这时候问题出在:这个字符串对象里的转义字符已经被错误处理过了(比如被多转义一次,或者转义丢失)。
解决方法
先排查字符串的真实内容
先打印出你捕获到的字符串的原始表示,用repr(raw_json_str)查看,这样能清楚看到字符串里实际的转义情况:raw_json_str = "你捕获的字符串" print(repr(raw_json_str))比如正确的JSON应该是
{"key": "value \"test\""},那么repr()的输出应该是'{"key": "value \\"test\\""}',这时候json.loads()就能正常解析。如果输出是'{"key": "value "test""}',说明转义已经丢失,导致JSON里的字符串未闭合,这就是报错的原因。从源头正确获取数据
如果你是用HTTP库(比如requests)获取亚马逊的请求响应,直接用库自带的JSON解析方法最可靠,它会自动处理原始字节的转义问题:import requests response = requests.get("你的亚马逊请求URL") data = response.json() # 直接用这个方法,比手动json.loads更稳妥或者用原始字节流解析:
data = json.loads(response.content)response.content是未经过Unicode解码的原始字节,能避免解码过程中丢失转义信息。修复已错误转义的字符串
如果你的字符串确实已经被错误转义(比如转义丢失),可以尝试用unicode_escape编码还原:fixed_str = raw_json_str.encode('utf-8').decode('unicode_escape') data = json.loads(fixed_str)这个操作会把字符串里的转义序列还原成JSON能识别的格式,比如把丢失的转义引号重新补回来。
别乱替换反斜杠
你之前试过的.replace("\\", "\\\\")和.escape("string_escape")反而会帮倒忙——它们会把单个反斜杠变成两个,导致JSON里的转义变成双重转义,让解析器更无法识别。
内容的提问来源于stack exchange,提问作者alive-and-well

