应设置ensure_ascii=false并配合encoding='utf-8':默认ensure_ascii=true将中文转为\uxxxx,设为false可保持原样输出,同时文件操作需指定utf-8编码以防乱码。

json.dump中文被\u4f60\u6211这类转义怎么办
默认情况下,json.dump 会把非 ASCII 字符(比如中文)转成 \uXXXX 形式,这是因为它启用了 ensure_ascii=True 的默认行为。这不是 bug,而是为兼容 HTTP/ASCII 环境做的保守设计;但你如果写入文件供人阅读、或对接前端调试,这种转义会让内容难以识别。
解决方法很简单:显式传入 ensure_ascii=False。
-
json.dump(obj, file, ensure_ascii=False)—— 写入文件时保持中文原样 -
json.dumps(obj, ensure_ascii=False)—— 生成字符串时同理 - 注意:文件写入时还需确保打开文件指定了
encoding='utf-8',否则可能报错或乱码
为什么加了ensure_ascii=False还是乱码
常见于 Windows 环境或未指定编码的文件操作。即使 JSON 不转义中文,底层文件写入仍依赖 Python 的文本编码机制。
典型错误写法:open('data.json', 'w') —— 在 Windows 上默认用 cp1252 编码,写入 UTF-8 中文就会出错或显示异常。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
- 必须显式声明编码:
open('data.json', 'w', encoding='utf-8') - 如果用
pathlib.Path.write_text(),也得传encoding='utf-8' - 终端或编辑器本身不支持 UTF-8(极少见)也会显示为乱码,但文件内容实际正确
dump和dumps在中文处理上有什么区别
二者行为一致,差异只在输出目标:dump 写入文件对象,dumps 返回字符串。它们共享全部参数,包括 ensure_ascii。
别混淆这两个函数的用途:
- 要保存到磁盘 → 用
json.dump(..., ensure_ascii=False)+open(..., encoding='utf-8') - 要拼接日志、发 HTTP 请求体、或调试打印 → 用
json.dumps(..., ensure_ascii=False) - 误用
json.dumps写文件(如f.write(json.dumps(...)))而没设ensure_ascii=False,结果一样是转义
要不要考虑indent和sort_keys对中文的影响
不影响中文是否转义,但会影响可读性与一致性。
-
indent=2让 JSON 换行缩进,方便人工查看;和ensure_ascii=False可共存,推荐调试时加上 -
sort_keys=True保证键顺序固定,利于 diff 或测试断言,中文 key 同样参与排序(按 Unicode 码点) - 生产环境若追求最小体积,可省略
indent和sort_keys,但ensure_ascii=False仍需保留
ensure_ascii,配对用 utf-8 编码。漏掉任意一个,都会在某个环节看到 \u 开头或者乱码——而且往往不是 JSON 库的问题,是文件流或终端的编码链断了。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










