java - Jackson 和泛型类型引用

标签 java json generics 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<T> {
     private List<T> myobjects;
        
     public void setMyObjects(List<T> ets) {
         this.myobjects = ets;
     }

     @NotNull
     @JsonIgnore
     public T getMyObject() {
         return myobjects.get(0);
     }
}

现在的问题是,当我调用请求对象内的 getMyObject() 时,Jackson 将嵌套的自定义对象作为 LinkedHashMap 返回。有什么方法可以指定需要返回 T 对象吗?例如:如果我发送了 Customer 类型的对象,那么应该从该列表中返回 Customer 吗?

最佳答案

这是 Java 类型删除的一个众所周知的问题:T 只是一个类型变量,您必须指示实际的类,通常作为 Class 参数。如果没有这些信息,最好的办法就是使用边界;普通 T 与“T extends Object”大致相同。然后 Jackson 会将 JSON 对象绑定(bind)为 map 。

在这种情况下,测试器方法需要访问类,并且您可以构造

JavaType type = mapper.getTypeFactory().
  constructCollectionType(List.class, Foo.class)

然后

List<Foo> list = mapper.readValue(new File("input.json"), type);

关于java - Jackson 和泛型类型引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23362859/

相关文章:

java - 根据基本的 oop 约定,菜单代码应该在 main 方法中还是在类中?

java - 用于计算飞镖可能完成情况的递归函数

java - Spring Batch - JpaPagingItemReader - 在 MySQL 中工作 - 在 PostgreSQL 中重复

java - 无法在 AsyncTask 中获取经纬度

java - 排序列表<MyObject>

Java - 将 UTF-8 字符串转换为二进制的正确方法是什么?

c# httpclient PostAsJson 发送 GET 请求而不是 POST

ios - 从 NSMutableArray 中获取数据

Java 泛型类型

java - 为什么调用具有不同类型的泛型方法会出现编译错误?