Flask视图返回JSON时特殊字符被转义为\uXXXX格式的问题排查
问题原因说明
特殊字符转义为\u00c5不是代码错误,是默认内置行为
这和你写的视图逻辑没关系,也不是编码异常:
- Flask把视图返回的字典转成HTTP响应时,底层基于Python标准库的json模块完成序列化,默认开启
ensure_ascii选项 - 这个选项开启时,所有非ASCII字符都会被转成
\uXXXX格式的Unicode转义序列,Å对应的Unicode码位就是U+00C5,所以最终输出的转义结果就是\u00c5 - 该默认设计是为了保证JSON在任意编码的传输、解析场景下都不会出现乱码,完全符合JSON规范的安全约定
- 控制台print能正常显示
HAMPDÅN,是因为print直接把字符串输出到终端,走终端的本地编码逻辑,不经过JSON序列化流程,两个处理链路完全独立,不能拿print的输出结果证明序列化环节有问题。
如果希望接口直接输出原文特殊字符、不做ASCII转义,只需要在全局主Flask应用实例上配置即可:
# 主应用初始化完成后追加这行 app.json.ensure_ascii = False
注意如果项目使用蓝图拆分路由,不要在蓝图实例上修改该配置,必须在全局主应用对象上设置,配置才会对所有路由生效。
关于返回结果中id字段从整数变为字符串的异常
你代码里定义的id是整数类型0,但实际返回结果里变成了字符串"0",这不是Flask原生序列化的行为,常见诱因有三个:
- 实际运行的代码和你贴出的片段不一致,赋值时已经把id转成了字符串类型
- 项目中间件、反向代理层或前端请求拦截器对响应内容做了二次处理,修改了字段类型
- 旧版本Werkzeug调试器的响应展示层做了类型美化,实际接口返回的原始内容中id还是整数类型,可以直接用
curl请求接口查看原始返回,不要依靠浏览器开发者工具的渲染结果做判断。
排查注意事项
- 不要用控制台print的输出判断JSON序列化环节的逻辑,两者处理链路完全独立
- 关闭ASCII转义后,要保证服务端输出的响应编码为UTF-8,避免部分老旧客户端解析出现乱码
- 如果使用的是Flask 2.2以下的旧版本,配置路径存在差异,需要通过
app.config['JSON_AS_ASCII'] = False实现同等效果
内容的提问来源于stack exchange,提问作者David Martin
相关产品推荐
相关产品推荐

