基于GSON中字段名的相同类型序列化,不带注解

mnemlml8  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(143)

给定一个不能修改的类

class ThirdPartyDTO
{
  Instant foo;
  Instant bar;
  // many more fields.
}

我有一个类的JSON表示,它使用两种不同的模式来表示foo和bar。
如果字段名是foo,则使用此模式,如果字段名是bar,则使用其他模式。
如何使用gson在不对每个字段名添加注解(因为我不能)的情况下实现这一点呢?

  • 谢谢-谢谢
eimct9ow

eimct9ow1#

因此,正如我在上面的注解中提到的,Gson类型适配器不能访问它们所序列化或反序列化的对象的完整上下文。(hierarchy)并不真正知道它可以应用于什么领域(而这正是帖子中的问题)为了将不同类型的适配器应用于不同的领域,可以使用JsonSerializerJsonDeserializer(因此,每个字段都必须手动处理,这是一项乏味的工作)。这里的另一个缺点是,应该处理类似DTO的ReflectiveTypeAdapterFactory不能直接扩展,而只能通过GsonBuilder进行扩展接口也受到限制。
但是,可以使用以下算法来实现解决方法:

  • 创建在反序列化时总是跳过特殊字段的排除策略(这仅影响ReflectiveTypeAdapterFactory);
  • 创建类型适配器工厂,该类型适配器工厂为这样的特殊字段创建类型适配器;
  • 一旦Gson反串行化了 Package 器对象, Package 器对象中的特殊字段被假定跳过,但是被设置为null(在原语的情况下的其它缺省值),后反串行化器类型适配器请求注入的策略来反串行化先前被排除策略跳过的每个特殊字段,因此为ReflectiveTypeAdapterFactory

这就是诀窍。
第一个
单元测试:
第一个
(for简单性,bar只是一个反转的字符串,使其对Java格式模式不明显,但使测试更健壮)
请注意,这种方法是 * 通用的 *(可能适用于除Instant之外的任何其他类型),在反序列化包含特殊字段的类时,需要在内存中缓冲JSON树(内置的JsonSerializerJsonDeserializer做同样的事情,所以谁在乎呢?),并失去了对@SerializedName@JsonAdapter等的一些特殊支持。

相关问题