gson序列化复杂嵌套对象需确保字段可访问,处理循环引用、日期格式、泛型、null值等;推荐用gsonbuilder配置setprettyprinting、serializenulls、setdateformat及typeadapter提升健壮性与可读性。

用 Gson 将复杂嵌套对象转成 JSON 字符串,核心是确保对象字段可被 Gson 自动识别(即有 public getter 或 public 字段),并正确处理循环引用、泛型、日期、null 值等常见问题。
基础用法:直接调用 toJson()
Gson 默认支持多层嵌套对象、集合、Map 等结构,只要对象结构清晰、无循环引用,一行代码就能搞定:
Gson gson = new Gson(); String json = gson.toJson(yourComplexObject);
例如一个含用户、订单、商品、地址的嵌套对象,只要所有类字段都是 public 或有标准 getter,Gson 会自动递归序列化。
处理常见陷阱
-
循环引用(如 A 引用 B,B 又引用 A):默认会抛 StackOverflowError。解决方法是自定义 TypeAdapter 或使用 @Expose + GsonBuilder 排除某些字段,更推荐用
GsonBuilder.setExclusionStrategies()过滤掉反向引用字段。 -
日期格式不友好(如输出为毫秒数):用
GsonBuilder.setDateFormat("yyyy-MM-dd HH:mm:ss")统一格式,或注册自定义 DateTypeAdapter。 -
泛型集合(如 List
) :直接传入TypeToken<list>>(){}.getType()</list>,否则 Gson 无法推断泛型类型,会导致 JSON 中丢失类型信息。 -
null 字段被忽略:默认不输出 null 值。如需保留,加
GsonBuilder.serializeNulls()。
提升可读性与调试效率
开发时建议启用格式化输出,方便查看嵌套结构是否符合预期:
Gson gson = new GsonBuilder()
.setPrettyPrinting() // 缩进换行
.serializeNulls() // 显示 null
.setDateFormat("yyyy-MM-dd HH:mm:ss")
.create();
这样生成的 JSON 更易人工核对字段层级、命名、值类型,尤其适合调试 API 请求体或配置导出场景。
自定义序列化逻辑(按需)
当某个嵌套字段需要特殊处理(如敏感字段脱敏、枚举转特定字符串、BigDecimal 保留两位小数),可实现 JsonSerializer<t></t> 并注册:
Gson gson = new GsonBuilder()
.registerTypeAdapter(User.class, new UserSerializer())
.create();
其中 UserSerializer 的 serialize() 方法可控制 User 及其嵌套 Address、Profile 等字段的最终 JSON 表现形式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











