Java JSON 与序列化

JSON 与对象映射的边界:DTO、空值、类型与安全反序列化意识。

#type / concept #status / growing #tech / dev #resource / java

[!info] 关联笔记

Java JSON 与序列化

这个概念为什么出现

HTTP API 与消息系统普遍使用 JSON。对象 ↔ JSON 涉及字段命名、空值、日期、未知属性与不可信输入安全。

[!abstract] 一句话理解 用 DTO/record 承载 JSON 形状;选择成熟库做映射;永远校验不可信输入,并谨慎对待 Java 原生二进制序列化。

最小可运行示例

场景:手工最小 JSON 片段拼装(零依赖演示)

public class OrderJsonMini {
    // 真实项目用 Jackson/Gson/JSONB;这里演示“字段契约”思维
    static String toJson(String id, int cents) {
        if (id == null || id.isBlank()) throw new IllegalArgumentException("id");
        return "{\"id\":\"" + id + "\",\"amountCents\":" + cents + "}";
    }
    public static void main(String[] args) {
        System.out.println(toJson("ORD-1", 99));
    }
}
javac OrderJsonMini.java && java OrderJsonMini

期望:

{"id":"ORD-1","amountCents":99}

手工拼接无法处理转义与复杂结构;生产用库。

结合场景再看三个关注点

  1. 契约字段稳定
  2. 字符串转义不能手滑。
  3. 反序列化是攻击面(类型多态配置等)。

核心概念与准确模型

1. 库选择

Jackson、Gson、JSON-B…

2. DTO 边界

不要直接把复杂实体图裸露给外部。

3. Java Serializable

历史二进制序列化安全风险高,默认不要用于不可信数据。

边界情况与反直觉行为

  1. 数字精度与 long/double。
  2. 时间格式时区。
  3. unknown property 严格/宽松策略。

常见误区

[!warning] 常见误区:开启任意多态类型反序列化 易导致远程代码执行类漏洞;跟进库安全公告。

工程实践

  1. 契约测试/OpenAPI。
  2. 限制字段与深度。
  3. record + 明确命名策略。
  4. 版本化 API。

本节总结

  • JSON 映射是边界工程
  • 用库与 DTO
  • 安全默认

自测题

  1. 为什么不推荐手写复杂 JSON?
  2. Serializable 的主要风险?
参考答案
  1. 转义/嵌套/性能/正确性难。
  2. 反序列化攻击面与兼容性脆弱。

延伸阅读与资料来源

资料类型支撑内容
Jackson常见映射
OWASP Deserialization安全风险
创建于 2026/7/15 更新于 2026/7/15