Java 键入\将注释与Gson一起使用
我有一个非常奇特的用例需要支持。用Java 键入\将注释与Gson一起使用,java,json,gson,json-deserialization,Java,Json,Gson,Json Deserialization,我有一个非常奇特的用例需要支持。用@Id注释的类型需要自定义反序列化逻辑,例如,值在反序列化之前应进行Base64解码(不是唯一的情况) 由于该行为适用于任何地方的任何带注释的类型(例如,列表),我想我需要一个自定义的TypeAdapterFactory,但问题是TypeAdapterFactory\create只允许访问TypeToken(因此类型,而不是带注释的类型) 公共类型适配器创建(Gson Gson,TypeToken类型){ if(type.isAnnotationPresent(
@Id
注释的类型需要自定义反序列化逻辑,例如,值在反序列化之前应进行Base64解码(不是唯一的情况)
由于该行为适用于任何地方的任何带注释的类型(例如,列表
),我想我需要一个自定义的TypeAdapterFactory
,但问题是TypeAdapterFactory\create
只允许访问TypeToken
(因此类型
,而不是带注释的类型
)
公共类型适配器创建(Gson Gson,TypeToken类型){
if(type.isAnnotationPresent(Id.class))//不可能:({
…//这里是自定义逻辑
}否则{
返回null;
}
}
因此,似乎没有办法根据自定义反序列化器中的注释做出决定。或者我缺少一种方法
我发现Immutables项目测试类型注释在生成
TypeAdapterFactory
时是否正确保留,或者至少看起来是这样……这给了我希望,有一种方法可以解决这个问题。你的意思是说你有像@Entity-public-class-MyEntity{@Id-private-Long-Id;}这样的东西吗反序列化?但是id
的类型可能会因实体的不同而有所不同。这是一个公平的解释,是的。常见的是@id
注释的所有内容都是Base64编码的,因此反序列化逻辑需要定制为首先解码。而且,由于它是一种类型,因此需要使用注释也可以是类似于List
。
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
if (type.isAnnotationPresent(Id.class)) //not possible :( {
... //custom logic here
} else {
return null;
}
}