杰克逊 - 反序列化泛型类变量 [英] Jackson - Deserialize Generic class variable

查看:107
本文介绍了杰克逊 - 反序列化泛型类变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我错误地发布了这个问题。我在这里正确地发布了问题......



我得到一个json字符串作为HTTP响应。我知道它的结构。它如下所示:

  public class Json< T> {
public Hits< T>命中;
}
public class Hits< T> {
public int found;
public int start;
public ArrayList< Hit< T>>击中;
}
public class Hit< T> {
public String id;
public Class< T>数据;

$ / code>

data字段可以属于任何类别。我只会在运行时才知道它。我将把它作为参数。这就是我的反序列化过程。

  public< T> void deSerialize(Class< T> clazz){
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(jsonString,new TypeReference< Json< T>>(){});
}

但是我收到一个错误 -

无法从java.lang.class访问private java.lang.class.Class()。无法设置访问权限。无法创建java.lang.Class构造函数

解决方案

您将需要构建 JavaType 明确地说,如果泛型类型只是动态可用的:

  //不要为每个请求创建新的ObjectMapper! 
final ObjectMapper mapper = new ObjectMapper();

public Json< T> void deSerialize(Class< T> clazz,InputStream json){
return mapper.readValue(json,
mapper.getTypeFactory()。constructParametricType(Json.class,clazz));
}


I had posted the question wrongly. I am posting the question correctly here ...

I am getting a json string as a HTTP response. I know the structure of it. It is as follows:

public class Json<T> {
    public Hits<T> hits;
}
public class Hits<T> {
    public int found;
    public int start;
    public ArrayList<Hit<T>> hit;
}
public class Hit<T> {
    public String id;
    public Class<T> data;
}

The "data" field can belong to any class. I will know it at runtime only. I will get it as a parameter. This is how I am deserializing.

public <T> void deSerialize(Class<T> clazz) {
    ObjectMapper mapper = new ObjectMapper();
    mapper.readValue(jsonString,  new TypeReference<Json<T>>() {});
}

But I am getting an error -

cannot access private java.lang.class.Class() from java.lang.class. Failed to set access. Cannot make a java.lang.Class constructor accessible

解决方案

You will need to build JavaType explicitly, if generic type is only dynamically available:

// do NOT create new ObjectMapper per each request!
final ObjectMapper mapper = new ObjectMapper();

public Json<T> void deSerialize(Class<T> clazz, InputStream json) {
    return mapper.readValue(json,
      mapper.getTypeFactory().constructParametricType(Json.class, clazz));
}

这篇关于杰克逊 - 反序列化泛型类变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆