Java中用Gson序列化复杂对象需主动控制字段包含、忽略策略、嵌套处理、日期格式和泛型类型;推荐@Expose白名单、ExclusionStrategy动态排除、TypeAdapter定制日期/枚举、TypeToken解决泛型擦除。

在Java中用Gson序列化复杂对象,关键不是“能不能”,而是“怎么控”——控制字段包含、忽略策略、嵌套处理、日期格式和泛型类型。Gson本身足够轻量,但默认行为常不满足业务需求,需主动配置。
自定义序列化规则:@Expose与ExclusionStrategy
默认Gson会序列化所有非transient、非static字段,但实际中常需精确控制。推荐用@Expose标注需要参与序列化的字段,并配合GsonBuilder.excludeFieldsWithoutExposeAnnotation()启用白名单机制:
- 在类中只给要导出的字段加
@Expose,未标注的自动跳过 - 若需动态排除(如按环境/角色),可实现
ExclusionStrategy,重写shouldSkipField()或shouldSkipClass() - 注意:
@Expose对private字段有效,无需getter/setter也能正常工作
处理嵌套对象与集合:无需额外配置
Gson原生支持多层嵌套对象、List、Map、数组等结构,只要字段类型是POJO或标准集合,无需注解或适配器:
- 例如
User含Address address字段,且Address有String city和List,Gson会递归序列化整棵树tags - 遇到循环引用(如A→B→A)会抛
StackOverflowError,此时需用@JsonIgnore(需搭配Gson的FieldNameFilter或自定义TypeAdapter)或重构模型 - Map的key若为非String类型(如Integer、自定义对象),默认转成字符串,若需保留原始类型,需注册
TypeAdapter
日期与枚举的格式化:用TypeAdapter精准接管
默认Gson把java.util.Date转成毫秒数,把枚举转成name(),往往不符合API规范。应使用TypeAdapter统一控制:
- 对Date:注册
DateTypeAdapter,指定SimpleDateFormat("yyyy-MM-dd HH:mm:ss") - 对枚举:实现
TypeAdapter,读取时支持name()或ordinal(),写入时输出自定义描述(如MyEnum.ACTIVE → "active") - 注册方式:
new GsonBuilder().registerTypeAdapter(Date.class, dateAdapter).create()
泛型集合反序列化:TypeToken不能少
序列化ListTypeToken显式传入泛型信息,否则Gson只能还原成LinkedTreeMap:
- 正确写法:
gson.fromJson(json, new TypeToken- >(){}.getType())
- 若泛型带多层(如
Map),同样用> TypeToken包裹:new TypeToken - 避免用
(List——类型擦除会导致运行时失败) gson.fromJson(..., List.class)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











