Jackson - 反序列化泛型类变量

2022-09-01 10:46:32

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

我收到一个json字符串作为HTTP响应。我知道它的结构。具体如下:

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;
}

“数据”字段可以属于任何类。我只在运行时知道它。我将把它作为一个参数。这就是我反序列化的方式。

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

但是我得到了一个错误 -

无法从 java.lang.class 访问私有 java.lang.class.Class()。无法设置访问权限。无法使 java.lang.Class 构造函数可访问


答案 1

如果泛型类型仅动态可用,则需要显式生成:JavaType

// 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));
}

答案 2

通用反序列化接口示例:

public interface Deserializable<T> {
    static final ObjectMapper mapper = new ObjectMapper();

    @SuppressWarnings("unchecked")
    default T deserialize(String rawJson) throws IOException {
        return mapper.readValue(rawJson, (Class<T>) this.getClass());
    }
}