一尘不染

Jackson和泛型类型参考

java

我想将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。


阅读 350

收藏
2020-03-17

共1个答案

一尘不染

这是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);
2020-03-17