推荐用 Jackson 或 Gson 将 Java 复杂嵌套对象序列化为 JSON,二者均支持多层嵌套、集合与泛型;Jackson 首选,需用 TypeReference 处理泛型擦除,配合 @JsonInclude、PropertyNamingStrategies 和自定义 JsonSerializer 灵活控制输出。

Java 中序列化复杂嵌套对象,推荐用 JSON 方式(非 Java 原生二进制序列化),因为可读、跨语言、易调试,且对嵌套结构天然友好。核心工具是 Jackson(最主流)或 Gson(轻量简洁),两者都能自动处理多层嵌套、集合、泛型、日期等。
用 Jackson 处理嵌套对象(推荐首选)
Jackson 的 ObjectMapper 默认就能递归序列化任意深度的嵌套 POJO,只要字段有标准 getter 方法、类有无参构造器。
- 确保 Maven 引入
jackson-databind(2.15.0+) - 嵌套类(如
Address)无需额外注解,只要字段可访问(public 或有 getter) - 控制空值:用
@JsonInclude(JsonInclude.Include.NON_NULL)注解类,跳过 null 字段 - 格式化输出:调用
objectMapper.enable(SerializationFeature.INDENT_OUTPUT)
处理泛型嵌套集合(比如 List<User> 或 Response<List<Item>>)
反序列化时必须显式告知类型信息,否则泛型擦除会导致解析失败或类型丢失。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 单层泛型(如
List<Person>):用new TypeReference<List<Person>>() {} - 多层嵌套(如
Response<Data<List<Tag>>>):TypeReference 必须完整写出每一层,不能省略 - 避免把 TypeReference 存为静态常量——匿名内部类在某些环境(如 Android、模块化部署)可能引发序列化异常
应对字段名不一致或特殊命名规则
JSON 字段常用下划线(user_name),而 Java 习惯驼峰(userName),需显式对齐。
立即学习“Java免费学习笔记(深入)”;
- Gson:构建时加
new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) - Jackson:加注解
@JsonProperty("user_name")到字段,或全局配置objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE) - 注意:Gson 的命名策略默认不递归生效,子类字段仍需单独标注
@SerializedName才可靠
需要动态定制某一层嵌套的序列化逻辑?
比如地址只输出城市和邮编,隐藏街道;或时间字段按特定格式转字符串。
- 写自定义序列化器(继承
JsonSerializer<Address>),重写serialize()方法手动写字段 - 注册到 ObjectMapper:
simpleModule.addSerializer(Address.class, new AddressSerializer()) - 也可用
@JsonSerialize(using = AddressSerializer.class)精准标注到某个字段,不影响其他地方

















