
本文介绍在无 Gson、Jackson 等外部依赖的前提下,使用 Java 原生能力(如 String.format、StringBuilder 和记录类 record)安全、简洁地将 POJO 转换为标准 JSON 字符串。
本文介绍在无 gson、jackson 等外部依赖的前提下,使用 java 原生能力(如 `string.format`、`stringbuilder` 和记录类 record)安全、简洁地将 pojo 转换为标准 json 字符串。
Java 标准库至今(截至 Java 21)仍未内置 JSON 序列化 API,因此“纯 Java、零依赖”实现 JSON 序列化,本质上是手动构造符合 JSON 规范的字符串。关键在于:正确转义字符串值、处理 null、区分数据类型(字符串需加引号,数字/布尔字面量不加),并保证结构合法。
最简实践推荐使用 record(Java 14+ 引入)替代传统类,因其天然不可变、自动生成 toString() 和访问器,大幅提升可读性与维护性:
public record DataObject(String access, String foo, Integer age) {}
接着,编写一个轻量级序列化方法(支持基本类型与 null 安全):
public static String toJson(DataObject obj) {
if (obj == null) return "null";
StringBuilder json = new StringBuilder("{");
json.append(""access":").append(quote(obj.access()))
.append(","foo":").append(quote(obj.foo()))
.append(","age":").append(obj.age() == null ? "null" : obj.age());
json.append("}");
return json.toString();
}
private static String quote(String s) {
if (s == null) return "null";
// 简单转义:仅处理双引号和反斜杠(生产环境建议扩展
等)
String escaped = s.replace("\", "\\").replace(""", "\"");
return """ + escaped + """;
}
调用示例:
DataObject data = new DataObject("public", "test", 25);
System.out.println(toJson(data));
// 输出:{"access":"public","foo":"test","age":25}
⚠️ 注意事项:
- 字符串转义不可省略:未转义的 " 或 会导致 JSON 无效;上述 quote() 方法仅覆盖基础场景,如需完整 RFC 8259 兼容,请参考 Unicode 转义(uXXXX)及控制字符处理。
- null 值显式处理:Java 的 Integer 为引用类型,null 必须输出 "null" 字面量,而非空字符串或跳过字段。
- 性能与可维护性权衡:此方案适用于少量、结构稳定的数据对象;若字段频繁增减,建议封装通用反射工具(但会牺牲类型安全与启动开销)。
- 不推荐 String.format 直接拼接:虽语法简洁,但难以安全处理嵌套、动态字段或特殊字符,易引入漏洞或格式错误。
总结:纯 Java JSON 序列化没有“银弹”,但借助 record + StringBuilder + 显式转义,可在零依赖前提下达成简洁、可控、可测试的实现。核心原则是——宁可多写几行健壮代码,也不妥协 JSON 合法性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











