Java JSON中文乱码本质是传输链路未统一UTF-8编码,需确保序列化器输出、HTTP响应头Content-Type、前端解析全程使用UTF-8。

Java 中 JSON 序列化时出现中文乱码或编码异常,本质不是“JSON 本身不支持中文”,而是序列化后的字节流在传输或写入过程中未正确声明或使用 UTF-8 编码。只要确保从序列化、输出、HTTP 响应到前端接收的整个链路统一用 UTF-8,问题基本就能解决。
明确字符集:序列化器本身不决定传输编码
JSON 标准规定字符串以 Unicode 表示,但 Java 库(如 Gson、Fastjson、Jackson)默认生成的是 String 对象——它内部已是 UTF-16,真正影响编码表现的是后续如何把 String 写成字节(比如写入 OutputStream、返回 HTTP 响应体)。
所以关键不在“JSON 序列化要不要设 charset”,而在:
- 序列化后是否直接转为字节数组?用了哪个
Charset? - 写入响应时是否设置了
Content-Type: application/json; charset=utf-8? - 前端是否按 UTF-8 解析响应体?
Gson:禁用 HTML 转义 + 确保输出用 UTF-8
Gson 默认会把中文转成 \u4f60\u597d,还会对 < > & 做 HTML 转义。若只需正常显示中文,两步到位:
- 调用
.disableHtmlEscaping()防止 Unicode 转义 - 输出时显式指定 UTF-8 编码
Gson gson = new GsonBuilder()
.disableHtmlEscaping() // 输出 "你好" 而非 "\u4f60\u597d"
.create();
String json = gson.toJson(user); // 得到正常中文的 String
// ✅ 正确写入响应(Servlet 场景)
response.setContentType("application/json; charset=utf-8");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(json); // 这里 writer 内部用 UTF-8 编码Fastjson:用 BrowserCompatible 特性 + 避免旧版本陷阱
Fastjson 1.x 默认对中文转义,启用 SerializerFeature.BrowserCompatible 即可:
String json = JSON.toJSONString(user, SerializerFeature.BrowserCompatible);
⚠️ 注意:
立即学习“Java免费学习笔记(深入)”;
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- Fastjson 1.2.83+ 已默认关闭中文转义,低版本务必加该参数
- 若用
JSONWriter直接写入OutputStream,需手动包装为OutputStreamWriter并指定 UTF-8
Jackson:全局配置比单次设置更可靠
Spring Boot 项目中,推荐在配置类中注册 UTF-8 支持和日期模块:
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
// 强制所有字符串输出不转义中文
mapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, false);
// 注册 Java 8 时间模块(附带 UTF-8 安全序列化)
mapper.registerModule(new JavaTimeModule());
return mapper;
}同时确保 application.properties 包含:
spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true spring.http.encoding.force=true
HTTP 层必须显式声明 charset
即使 JSON 字符串内容是正常的中文,如果响应头没带 charset=utf-8,浏览器或某些客户端可能按 ISO-8859-1 解析,导致乱码。
✅ 正确响应头:
Content-Type: application/json; charset=utf-8
❌ 错误写法(缺 charset):
Content-Type: application/json
前端也要配合:避免二次 decode
常见错误是前端收到 UTF-8 响应后,又用 decodeURIComponent 或 unescape 处理——这会导致 \u4f60 被误解析。只要后端响应头和内容都规范,前端直接 JSON.parse() 即可,无需额外解码。
不复杂但容易忽略

















