如何关闭Python 3 json模块对转义Unicode字符的自动解析?
问题原因
当你用json.loads()解析包含\u0026的JSON字符串时,JSON规范要求解析器必须把Unicode转义序列转换成对应的字符,所以\u0026会被自动解析成&。而json.dumps()默认只会转义JSON语法强制要求的字符(比如双引号、反斜杠),&不在这个强制转义列表里,所以最终输出的就是未转义的&&,这就是你遇到的问题根源。
解决方案
要让输出的JSON字符串保留\u0026而非&,你需要在序列化阶段手动把&转义回\u0026,这里有两种简单可行的实现方式:
方法一:自定义JSON编码器
你可以继承json.JSONEncoder类,重写encode方法,在默认序列化完成后替换所有&:
import json class EscapeAmpEncoder(json.JSONEncoder): def encode(self, obj): # 先执行默认序列化逻辑 encoded_str = super().encode(obj) # 将所有&替换为\u0026 return encoded_str.replace('&', '\\u0026') # 你的测试代码 example=r""" { "command": "python -m spacy download en \u0026\u0026 python -m spacy download de \u0026\u0026 python main.py" } """ json_example = json.loads(example) # 使用自定义编码器序列化 result = json.dumps(json_example, cls=EscapeAmpEncoder) print(result)
运行后会输出符合你预期的结果:
{"command": "python -m spacy download en \u0026\u0026 python -m spacy download de \u0026\u0026 python main.py"}
方法二:直接替换序列化后的字符串
如果你的场景不需要复杂的自定义逻辑,也可以直接在json.dumps()得到结果后手动替换字符:
import json example=r""" { "command": "python -m spacy download en \u0026\u0026 python -m spacy download de \u0026\u0026 python main.py" } """ json_example = json.loads(example) # 先正常序列化,再替换&为\u0026 raw_result = json.dumps(json_example) result = raw_result.replace('&', '\\u0026') print(result)
这个方法和编码器的效果完全一致,适合快速解决问题。
注意事项
- 这两种方法会把字符串中所有的
&(包括原本就存在的、不是从\u0026解析来的)都转义成\u0026。如果你的场景需要区分这两种&,可能需要更精细的处理,但从你的示例来看,这个替换完全符合需求。 - JSON规范本身不要求
&被转义,所以这种处理是针对你的特定需求的自定义行为——标准JSON解析器读取这个输出时,依然会把\u0026解析回&,这是完全符合规范的。
内容的提问来源于stack exchange,提问作者Janos Binder
相关产品推荐
相关产品推荐

