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

如何避免json.dumps()对已编码字符串产生二次转义问题

问题本质

出现双重转义的核心原因非常明确:你传入json.dumps()的Python字符串本身就已经包含了转义用的反斜杠,并非存储原始的特殊字符本身。
举个例子,当你打印record["name"]看到输出是Sean \"Puff Daddy\" Combs时,说明这个字符串在Python内存里实际存储的内容是Sean +反斜杠+"Puff Daddy"+反斜杠+ Combs,而非直观看到的带双引号的人名。json.dumps()的本职工作就是按照JSON规范对字符串内的特殊字符做转义,它检测到字符串里存在反斜杠,自然会把反斜杠转义为\\,最终输出就变成了Sean \\"Puff Daddy\\" Combs的双重转义结果,这不是JSON库的bug,是输入数据不符合预期。
不管是第三方二进制读取模块还是标准库csv.DictReader触发这个问题,本质都是上游读取环节返回了预先做过JSON风格转义的字符串,而非原始文本值。csv.DictReader本身不会做任何转义操作,出现这个问题基本是因为你读取的CSV文件里本身存的就是提前转义过的文本,或是你在读取后手动做过转义处理。

解决方法

按优先级从高到低选择方案:

  • 优先从源头关闭自动转义:检查你用的二进制读取模块的配置参数,只要有「关闭特殊字符自动转义」「返回原始字符串」的选项就直接打开,让上游返回未经任何转义的原始值,后续统一交给json.dumps()做符合JSON规范的转义。这是最稳妥的方案,能一次性覆盖双引号、反斜杠、换行符、控制字符等所有需要转义的场景,不会漏处理。
  • 源头无法修改配置时,先做标准反转义再序列化:绝对不要自己写正则替换\"为",这种写法遇到其他转义字符(比如\n、\t、\\本身)一定会出问题。直接用标准库json模块自带的解析能力做反转义即可——上游返回的带转义的字符串本身就是符合JSON字符串语法的,只需要把它包装成合法的JSON字符串片段再解析,就能拿到原始值:
import json

# 模拟你从上游拿到的、已经被预转义的字符串(打印出来显示为 Sean \"Puff Daddy\" Combs)
pre_escaped_str = 'Sean \\"Puff Daddy\\" Combs'
# 包装为合法JSON字符串后解析,得到无多余转义的原始值
original_str = json.loads(f'"{pre_escaped_str}"')
# 再做JSON序列化就不会出现双重转义
output = json.dumps({"name": original_str}, ensure_ascii=False)
# 输出结果为 {"name": "Sean \"Puff Daddy\" Combs"},完全符合JSON规范,无多余反斜杠

注意:如果执行json.loads时抛出解析错误,说明上游返回的预转义字符串本身不符合JSON语法规范,这种情况没有通用处理方案,必须先修复上游的转义逻辑。

  • 完全不需要自己实现专属序列化算法:JSON的转义规则覆盖十多种特殊场景,除了可见的双引号、反斜杠,还有不可见的控制字符、Unicode代理对等,手写序列化逻辑极容易出现转义不全、JSON注入、生成的文件无法被标准解析器读取的问题。Python标准库的json模块已经经过十几年的生产验证,只要传入的是原始未转义的Python原生值,序列化结果100%符合规范。

内容的提问来源于stack exchange,提问作者Fontanka16

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:39:39