objectmapper.writevalueasstring() 生成的 json 字符串默认采用 utf-8 编码,该行为由 jackson 内部字符处理机制保证,不依赖系统默认编码,且无需额外配置即可安全支持中文、emoji 等 unicode 字符。
objectmapper.writevalueasstring() 生成的 json 字符串默认采用 utf-8 编码,该行为由 jackson 内部字符处理机制保证,不依赖系统默认编码,且无需额外配置即可安全支持中文、emoji 等 unicode 字符。
ObjectMapper.writeValueAsString() 是 Jackson Databind 中最常用的序列化方法之一,它将 Java 对象转换为标准 JSON 格式的 String。许多开发者关心其输出编码是否可靠——答案是明确的:该方法返回的 String 对象在 JVM 内部以 UTF-16 表示(这是 Java String 的固有特性),但其逻辑语义和序列化行为严格遵循 UTF-8 编码规范。
关键在于理解两层抽象:
- String 层面:Java 的 String 类型本身基于 UTF-16 编码存储;writeValueAsString() 返回的是一个 String 实例,因此其内存表示与 JVM 一致,与平台编码无关;
- JSON 规范层面:根据 RFC 8259,JSON 文本默认编码为 UTF-8(同时也兼容 UTF-16/UTF-32,但需含 BOM 或明确声明);Jackson 在实现中始终以 UTF-8 语义生成 JSON 字符内容,确保 {"name": "张三", "emoji": "?"} 这类字符串能被任何标准 JSON 解析器正确识别。
以下代码可验证其对多语言字符的支持能力:
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> data = new HashMap<>();
data.put("chinese", "你好");
data.put("emoji", "?");
data.put("latin", "café");
String json = mapper.writeValueAsString(data);
System.out.println(json);
// 输出: {"chinese":"你好","emoji":"?","latin":"café"}✅ 正确输出表明:无需设置 ObjectMapper 的编码参数(如 setCharset() 不影响 writeValueAsString),Jackson 已内置 UTF-8 安全性保障。
⚠️ 注意事项:
- writeValueAsString() 不涉及字节流或文件写入,因此不会触发实际的字符编码转换(如 OutputStreamWriter 的 charset 参数)。若需写入文件或 HTTP 响应体,请使用 writeValue(OutputStream, obj) 并配合 StandardCharsets.UTF_8 显式指定编码;
- 若后续将该 String 转为 byte[],请务必显式调用 .getBytes(StandardCharsets.UTF_8),避免误用 String.getBytes()(该方法依赖系统默认编码,存在跨环境风险);
- ObjectMapper 的 setDefaultEncoding() 方法仅影响 writeValue(OutputStream) 等字节输出场景,对 writeValueAsString() 无作用。
总结:writeValueAsString() 是线程安全、编码可靠的 JSON 字符串生成工具,默认且唯一推荐的编码语义即为 UTF-8。开发者可放心用于国际化 Web API、日志记录及配置序列化等场景,无需额外编码干预。










