我有一个json字符串,我应该反序列化到下面的类

class Data <T> {
    int found;
    Class<T> hits
}

我该怎么做? 这是通常的做法

mapper.readValue(jsonString, Data.class);

但是我怎么提到T代表什么呢?


当前回答

从Jackson 2.5开始,一种优雅的解决方法是使用 TypeFactory。类参数化,类…parameterClasses)方法,该方法允许通过指定参数化类及其参数化类型直接定义Jackson JavaType。

假设你想反序列化到Data<String>,你可以这样做:

// the json variable may be a String, an InputStream and so for...
JavaType type = mapper.getTypeFactory().constructParametricType(Data.class, String.class);
Data<String> data = mapper.readValue(json, type);

注意,如果类声明了多个参数化类型,它并不会变得更难:

class Data <T, U> {
    int found;
    Class<T> hits;
    List<U> list;
}

我们可以这样做:

JavaType type = mapper.getTypeFactory().constructParametricType(Data.class, String.class, Integer);
Data<String, Integer> data = mapper.readValue(json, type);

其他回答

你可以把它包装在另一个类中,这个类知道你的泛型类型的类型。

Eg,

class Wrapper {
 private Data<Something> data;
}
mapper.readValue(jsonString, Wrapper.class);

这里Something是一个具体的类型。每个具体化类型都需要一个包装器。否则Jackson就不知道该创建什么对象。

您需要为所使用的每个泛型类型创建一个TypeReference对象,并使用该对象进行反序列化。例如:

mapper.readValue(jsonString, new TypeReference<Data<String>>() {});

只需在Util类中编写一个静态方法。我正在从文件中读取Json。你也可以给String给readValue

public static <T> T convertJsonToPOJO(String filePath, Class<?> target) throws JsonParseException, JsonMappingException, IOException, ClassNotFoundException {
        ObjectMapper objectMapper = new ObjectMapper();
        return objectMapper.readValue(new File(filePath), objectMapper .getTypeFactory().constructCollectionType(List.class, Class.forName(target.getName())));
}

用法:

List<TaskBean> list =  Util.<List<TaskBean>>convertJsonToPOJO("E:/J2eeWorkspaces/az_workspace_svn/az-client-service/dir1/dir2/filename.json", TaskBean.class);

对于类Data<>

ObjectMapper mapper = new ObjectMapper();
JavaType type = mapper.getTypeFactory().constructParametrizedType(Data.class, Data.class, Parameter.class);
Data<Parameter> dataParam = mapper.readValue(jsonString,type)

从Jackson 2.5开始,一种优雅的解决方法是使用 TypeFactory。类参数化,类…parameterClasses)方法,该方法允许通过指定参数化类及其参数化类型直接定义Jackson JavaType。

假设你想反序列化到Data<String>,你可以这样做:

// the json variable may be a String, an InputStream and so for...
JavaType type = mapper.getTypeFactory().constructParametricType(Data.class, String.class);
Data<String> data = mapper.readValue(json, type);

注意,如果类声明了多个参数化类型,它并不会变得更难:

class Data <T, U> {
    int found;
    Class<T> hits;
    List<U> list;
}

我们可以这样做:

JavaType type = mapper.getTypeFactory().constructParametricType(Data.class, String.class, Integer);
Data<String, Integer> data = mapper.readValue(json, type);