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

回到顶部