Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.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 扩展时Jackson TypeReference有效吗?_Java_Json_Jackson - Fatal编程技术网

Java 扩展时Jackson TypeReference有效吗?

Java 扩展时Jackson TypeReference有效吗?,java,json,jackson,Java,Json,Jackson,下面的代码片段是不言自明的。您可以看到类型信息没有被删除,但是mapper没有得到类型信息。我猜杰克逊不允许这样,对吧?如果我直接传递TypeReference,它将被正确地反序列化 public class AgentReq<T> extends TypeReference<AgentResponse<T>> {...} mapper.readValue(reader, new AgentReq<Map<String, Set<Whate

下面的代码片段是不言自明的。您可以看到类型信息没有被删除,但是mapper没有得到类型信息。我猜杰克逊不允许这样,对吧?如果我直接传递TypeReference,它将被正确地反序列化

public class AgentReq<T> extends TypeReference<AgentResponse<T>> {...}

mapper.readValue(reader, new AgentReq<Map<String, Set<Whatever>>>());
public类AgentReq扩展类型引用{…}
readValue(reader,new AgentReq());
如果我这样做也不起作用:

public class AgentReq<T> {

    public TypeReference<AgentResponse<T>> getTypeRef() {
        return new TypeReference<AgentResponse<T>>() {};
    }
}

mapper.readValue(reader, new AgentReq<Map<String, Set<Whatever>>>()).getTypeRef();
公共类代理{
公共类型引用getTypeRef(){
返回新的TypeReference(){};
}
}
readValue(reader,new AgentReq()).getTypeRef();
我使用的是2.1.5版


编辑:为了将来参考,在解决问题时不要低估TypeReference构造函数。在那里,您可以直接看到它是否能够检索类型信息。顺便说一句,答案是否定的,你不能扩展TypeReference并期望它工作,你甚至不能重写它的getType()方法并向它提供从你的类解析的类型信息,因为你只能得到getClass().getGenericSuperClass()。。。您不能执行getClass()。getGenericClass()

您需要了解
类型引用的工作原理。为此,我们进入源代码

protected TypeReference()
{
    Type superClass = getClass().getGenericSuperclass();
    if (superClass instanceof Class<?>) { // sanity check, should never happen
        throw new IllegalArgumentException("Internal error: TypeReference constructed without actual type information");
    }
    ...
    _type = ((ParameterizedType) superClass).getActualTypeArguments()[0];
}
创建的实例的直接超类是参数化类型
TypeReference
,根据javadoc,我们应该得到一个
type
实例,它准确地反映了源代码中使用的实际类型参数:

运行

new Subclass<String>();

将编译并运行,但类型
AgentReq
将丢失。Jackson将使用默认类型序列化JSON。
元素
将反序列化为
代理响应
,而
映射元素
将反序列化为
映射
,JSON数组将反序列化为
数组列表

您能提供一个使用该
类型引用的类吗?一个小房间?现在是凌晨1点35分,我得去睡索蒂里奥斯。。。明天早上我会再看一次。NP,我回家后也会试试。我低估了TypeReference构造函数,正如你所描述的,所有重要的事情都发生了,你可以看到,除非你直接将TypeReference抽象类实例化为匿名类,它没有机会解析类型信息。非常感谢。
TypeReference<String>
public class Subclass<T> extends TypeReference<AgentResponse<T>>{
    public Subclass() {
        System.out.println(getClass().getGenericSuperclass());
        System.out.println(((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
    }
}
new Subclass<String>();
com.fasterxml.jackson.core.type.TypeReference<Test.AgentResponse<T>>
Test.AgentResponse<T>
new Subclass<String>(){}; // anonymous inner class
Test.Subclass<java.lang.String>
class java.lang.String
reader = new StringReader("{\"element\":{\"map-element\":[{\"name\":\"soto\", \"value\": 123}]}}");
obj = mapper.readValue(reader, new AgentReq<Map<String, Set<Whatever>>>());