json转换可替代java原生序列化,因其跨语言、高兼容、更安全、支持常见类型;但需注意日期配置、泛型反序列化、字段权限及null策略等细节。

Java 对象序列化(Serializable)和 JSON 转换本质目的不同,但在跨系统通信、API 数据交换、缓存存储等场景中,JSON 转换可作为原生序列化的实际替代方案——不是语法层面的“替代”,而是功能层面更安全、通用、可维护的演进选择。关键在于理解差异与适用边界。
JSON 转换为什么能替代原生序列化使用场景
原生序列化(ObjectOutputStream/ObjectInputStream)生成的是 Java 专属二进制流,存在严重限制:
- ❌ 仅限 Java 环境,无法被前端、Python、Go 等其他语言解析
- ❌ 类结构变更(如字段增删、类型修改)极易导致
InvalidClassException(因serialVersionUID不匹配) - ❌ 存在反序列化漏洞风险(如
JDK-8071495),禁用未知类加载是常态 - ❌ 不支持部分类型(如
LocalDateTime、Optional、非 public 字段)需手动处理
而 JSON 转换天然规避这些问题:
- ✅ 文本格式,人类可读、机器可解析,全语言互通
- ✅ 字段缺失或新增时默认忽略或设为 null(取决于库配置),兼容性更强
- ✅ 无反射执行风险,不触发任意代码,安全性更高
- ✅ 支持日期、枚举、泛型集合、嵌套对象等常见结构,扩展灵活
常见 JSON 库如何完成“替代”动作
以主流库为例,核心操作统一简洁:
-
Fastjson(注意:已停止维护,生产环境建议迁移)
String json = JSON.toJSONString(user); // 对象 → JSON User user = JSON.parseObject(json, User.class); // JSON → 对象
-
Jackson(推荐,Spring 默认)
ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(user); // 对象 → JSON User user = mapper.readValue(json, User.class); // JSON → 对象
-
Gson(Google,轻量稳定)
Gson gson = new Gson(); String json = gson.toJson(user); // 对象 → JSON User user = gson.fromJson(json, User.class); // JSON → 对象
所有库都支持:
- 忽略空值、时间格式定制(如
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")) - 处理循环引用(Jackson 的
@JsonIdentityInfo) - 过滤敏感字段(
@JsonIgnore或SimpleBeanPropertyFilter)
替代时需注意的关键细节
日期类型必须显式配置
LocalDateTime、ZonedDateTime等 JSR-310 类型默认无法直接序列化。Jackson 需注册JavaTimeModule,Gson 需注册TypeAdapter,否则抛异常或输出空对象。-
泛型集合不能直接传 Class
反序列化List<user></user>时,不能写gson.fromJson(json, List.class)—— 类型擦除会导致转成List<map></map>。应使用:- Jackson:
mapper.readValue(json, new TypeReference<list>>() {})</list> - Gson:
gson.fromJson(json, new TypeToken<list>>() {}.getType())</list>
- Jackson:
字段访问权限需开放
私有字段 + 无 getter/setter 时,Jackson 默认不可见(除非配置Visibility.ANY),Gson 默认可读私有字段但不可写(需GsonBuilder.setFieldNamingPolicy()或注解配合)。null 值处理策略要明确
原生序列化保留 null;JSON 默认也保留,但若前端要求省略空字段,Jackson 可配@JsonInclude(JsonInclude.Include.NON_NULL),Fastjson 用SerializerFeature.WriteMapNullValue控制。
不需要再用 implements Serializable + private static final long serialVersionUID 这套机制来保障传输稳定性——JSON 的结构松耦合特性已内建兼容能力。只要接口契约(字段名、类型)保持向后兼容,升级就平滑。
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











