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

如何关闭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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:03:45