使用Gson RuntimeTypeAdapterFactory反序列化后userType变为null如何解决
问题原因
RuntimeTypeAdapterFactory默认行为是仅将userType字段作为子类类型判定的标识,读取到该字段值完成子类匹配后,会直接丢弃该字段,不会将其值映射到实体类的userType属性上。- 你的User基类和所有子类都没有提供public无参构造方法,Gson反序列化时无法调用你编写的带参构造,子类带参构造中硬编码传入userType的逻辑不会执行,Gson默认通过Unsafe实例化对象时也不会主动给
userType属性赋值,最终导致该属性为null。
解决方案
- 第一步:创建
RuntimeTypeAdapterFactory时开启保留类型字段的配置,修改注册代码如下:
RuntimeTypeAdapterFactory<User> adapter = RuntimeTypeAdapterFactory.of(User.class, "userType") // 新增这一行配置,保留类型字段的值到实体属性 .maintainTypeField(true) .registerSubtype(Admin.class, UserType.ADMIN.name()) .registerSubtype(Owner.class, UserType.OWNER.name()) .registerSubtype(Agent.class, UserType.AGENT.name()) .registerSubtype(Regular.class, UserType.REGULAR.name()) .registerSubtype(Pending.class, UserType.PENDING.name());
- 第二步:给User基类和所有子类添加public无参构造方法,避免Gson通过Unsafe实例化对象出现异常,示例如下:
// User基类添加 public User() { } // Admin子类添加 public Admin() { } // 其余Owner、Regular等子类同理添加无参构造即可
如果你的JSON中不存在子类特有的字段(比如示例JSON里没有adminDetails、ownerDetails这些字段),反序列化后这些特有字段会自动为null,不影响其他属性的正常赋值。
内容的提问来源于stack exchange,提问作者winsonloo
相关产品推荐
相关产品推荐

