Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 键入\将注释与Gson一起使用_Java_Json_Gson_Json Deserialization - Fatal编程技术网

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;
    }
}