Jackson和泛型类型参考
我想将jackson json库用于通用方法,如下所示:
public MyRequest<T> tester() { TypeReference<MyWrapper<T>> typeRef = new TypeReference<MyWrapper<T>>();
MyWrapper<T> requestWrapper = (MyWrapper<T>) JsonConverter.fromJson(jsonRequest, typeRef);
return requestWrapper.getRequest();
}
…
public class MyWrapper<T> { private MyRequest<T> request;
public MyRequest<T> getRequest() {
return request;
}
public void setRequest(MyRequest<T> request) {
this.request = request;
}
}
public class MyRequest{
private List<T> myobjects;
public void setMyObjects(List<T> ets) {
this.myobjects = ets;
}
@NotNull
@JsonIgnore
public T getMyObject() {
return myobjects.get(0);
}
}
现在的问题是,当我调用位于请求对象内的getMyObject()时,杰克逊将嵌套的自定义对象作为LinkedHashMap返回。有什么方法可以指定需要返回T对象吗?例如:如果我发送了类型为Customer的对象,则应该从该List?中返回Customer。
回答:
这是Java类型擦除的一个众所周知的问题:T只是一个类型变量,你必须指示实际的类,通常将其作为Class参数。没有这些信息,最好的办法就是使用界限。普通T与“ T扩展对象”大致相同。然后Jackson会将JSON对象绑定为Maps。
在这种情况下,tester方法需要有权访问Class,你可以构造
JavaType type = mapper.getTypeFactory(). constructCollectionType(List.class, Foo.class)
接着
List<Foo> list = mapper.readValue(new File("input.json"), type);
以上是 Jackson和泛型类型参考 的全部内容, 来源链接: utcz.com/qa/400918.html