给定一个不能修改的类
class ThirdPartyDTO { Instant foo; Instant bar; // many more fields. }
我有一个类的JSON表示,它使用两种不同的模式来表示foo和bar。如果字段名是foo,则使用此模式,如果字段名是bar,则使用其他模式。如何使用gson在不对每个字段名添加注解(因为我不能)的情况下实现这一点呢?
eimct9ow1#
因此,正如我在上面的注解中提到的,Gson类型适配器不能访问它们所序列化或反序列化的对象的完整上下文。(hierarchy)并不真正知道它可以应用于什么领域(而这正是帖子中的问题)为了将不同类型的适配器应用于不同的领域,可以使用JsonSerializer和JsonDeserializer(因此,每个字段都必须手动处理,这是一项乏味的工作)。这里的另一个缺点是,应该处理类似DTO的ReflectiveTypeAdapterFactory不能直接扩展,而只能通过GsonBuilder进行扩展接口也受到限制。但是,可以使用以下算法来实现解决方法:
JsonSerializer
JsonDeserializer
ReflectiveTypeAdapterFactory
GsonBuilder
null
这就是诀窍。第一个单元测试:第一个(for简单性,bar只是一个反转的字符串,使其对Java格式模式不明显,但使测试更健壮)请注意,这种方法是 * 通用的 *(可能适用于除Instant之外的任何其他类型),在反序列化包含特殊字段的类时,需要在内存中缓冲JSON树(内置的JsonSerializer和JsonDeserializer做同样的事情,所以谁在乎呢?),并失去了对@SerializedName、@JsonAdapter等的一些特殊支持。
bar
Instant
@SerializedName
@JsonAdapter
1条答案
按热度按时间eimct9ow1#
因此,正如我在上面的注解中提到的,Gson类型适配器不能访问它们所序列化或反序列化的对象的完整上下文。(hierarchy)并不真正知道它可以应用于什么领域(而这正是帖子中的问题)为了将不同类型的适配器应用于不同的领域,可以使用
JsonSerializer
和JsonDeserializer
(因此,每个字段都必须手动处理,这是一项乏味的工作)。这里的另一个缺点是,应该处理类似DTO的ReflectiveTypeAdapterFactory
不能直接扩展,而只能通过GsonBuilder
进行扩展接口也受到限制。但是,可以使用以下算法来实现解决方法:
ReflectiveTypeAdapterFactory
);null
(在原语的情况下的其它缺省值),后反串行化器类型适配器请求注入的策略来反串行化先前被排除策略跳过的每个特殊字段,因此为ReflectiveTypeAdapterFactory
。这就是诀窍。
第一个
单元测试:
第一个
(for简单性,
bar
只是一个反转的字符串,使其对Java格式模式不明显,但使测试更健壮)请注意,这种方法是 * 通用的 *(可能适用于除
Instant
之外的任何其他类型),在反序列化包含特殊字段的类时,需要在内存中缓冲JSON树(内置的JsonSerializer
和JsonDeserializer
做同样的事情,所以谁在乎呢?),并失去了对@SerializedName
、@JsonAdapter
等的一些特殊支持。