Java Jackson没有反序列化它已经序列化的通用列表

Java Jackson没有反序列化它已经序列化的通用列表,java,json,serialization,jersey,jackson,Java,Json,Serialization,Jersey,Jackson,当将ApacheJersey与Jackson一起用于JSON序列化(在服务器和客户端上)时,我在反序列化通用列表时遇到了一个问题 我正在生成的JSON如下,“data”中的所有3个类都实现“CheckStatusDetail”: 生成此JSON的对象如下所示,我在客户端使用相同的类: public class NSResponse<T> implements Serializable { private static final long serialVersionUID

当将ApacheJersey与Jackson一起用于JSON序列化(在服务器和客户端上)时,我在反序列化通用列表时遇到了一个问题

我正在生成的JSON如下,“data”中的所有3个类都实现“CheckStatusDetail”:

生成此JSON的对象如下所示,我在客户端使用相同的类:

public class NSResponse<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    public static final int STATUS_OK       = 0;
    public static final int STATUS_ERROR    = -1;

    public static final String TYPE_OBJECT  = "object";
    public static final String TYPE_ARRAY   = "array";

    private int status;
    private int errorCode;
    private String errorMessage;
    private String type;

    private List<T> data;

    private int count;

    public NSResponse() {   }

    public NSResponse(int errorCode, String errorMessage) {
        this.status = STATUS_ERROR;
        this.errorCode = errorCode;
        this.errorMessage = errorMessage;
    }

    public NSResponse(T data) {
        this.status = STATUS_OK;
        this.type = TYPE_OBJECT;
        this.data = new ArrayList<T>();
        this.data.add(data);
        this.count = this.data.size();
    }

    public NSResponse(List<T> data) {
        this.status = STATUS_OK;
        this.type = TYPE_ARRAY;
        this.data = data;
        this.count = (data == null) ? 0 : data.size();
    }

    /* Getters and setters omitted */
}
当尝试在客户端使用JSON时,出现以下错误:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.rrr.base.status.module.dto.CheckStatusDetail
在反序列化“数据”字段后,第一次尝试访问该字段时会发生此错误。如果我调试客户端,Jackson似乎返回了一个列表,这解释了错误,因为我需要一个列表


我做错了什么?

您需要显示更多的代码,特别是关于如何调用反序列化的代码,但从错误中我猜您没有传递T的参数化。如果缺少,则只能假设T是Object类型,并且对象的标称类型绑定到“本机”Java类型,对于JSON对象,这是Map(特别是LinkedHashMap以保持秩序)

因此,您可能只需要在反序列化时指定对象的泛型类型(对于序列化,不需要它,因为运行时类型可用);或者使用TypeReference(不是普通类,因为它没有泛型类型信息),或者通过构造启用泛型的JavaType。例如:

NSResponse<CheckStatusDetail> resp = mapper.readValue(json, new TypeReference<NSResponse<CheckStatusDetail>>() { });
NSResponse resp=mapper.readValue(json,新类型引用(){});

NSResponse resp=mapper.readValue(json,TypeFactory.genericType(NSResponse.class,CheckStatusDetails.class));

这两种方法都有效;如果type仅动态可用,则后者是必需的。

非常好,我必须以稍微不同的方式使用TypeFactory:“TypeFactory.type(nsrresponse.class,CheckStatusDetails.class)”,但可能是版本不匹配,结果正是我想要的。谢谢!是的,我没有检查确切的方法名称(加上1.8确实有一些小改动),但重要的是你让它工作起来了。@seanhodges TypeFactory.type不推荐使用什么?TypeFactory不是不推荐使用的,只是它的静态方法。所以你需要找到一个实例;最常见的是使用ObjectMapper.getTypeFactory()找到它.Wow,这个解决方案对我来说真是太棒了!它帮助我在Java应用程序中能够动态处理从Facebook的Graph API接收的JSON数组数据,并将数据反序列化为适当对象的数组。
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.rrr.base.status.module.dto.CheckStatusDetail
NSResponse<CheckStatusDetail> resp = mapper.readValue(json, new TypeReference<NSResponse<CheckStatusDetail>>() { });
NSResponse<CheckStatusDetail> resp = mapper.readValue(json, TypeFactory.genericType(NSResponse.class, CheckStatusDetails.class));