我有一个json字符串,我应该反序列化到下面的类
class Data <T> {
int found;
Class<T> hits
}
我该怎么做? 这是通常的做法
mapper.readValue(jsonString, Data.class);
但是我怎么提到T代表什么呢?
我有一个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);
其他回答
你不能这样做:你必须指定完全解析的类型,比如Data<MyType>。T只是一个变量,as没有意义。
但如果您的意思是T将是已知的,只是不是静态的,那么您需要动态地创建与TypeReference等价的TypeReference。其他问题可能已经提到了这一点,但它应该是这样的:
public Data<T> read(InputStream json, Class<T> contentClass) {
JavaType type = mapper.getTypeFactory().constructParametricType(Data.class, contentClass);
return mapper.readValue(json, type);
}
需要反序列化的JSON字符串必须包含关于参数T的类型信息。 您必须在每个可以作为参数T传递给类Data的类上添加Jackson注释,以便Jackson可以从JSON字符串中读取/写入关于参数类型T的类型信息。
让我们假设T可以是任何扩展抽象类Result的类。
class Data <T extends Result> {
int found;
Class<T> hits
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({
@JsonSubTypes.Type(value = ImageResult.class, name = "ImageResult"),
@JsonSubTypes.Type(value = NewsResult.class, name = "NewsResult")})
public abstract class Result {
}
public class ImageResult extends Result {
}
public class NewsResult extends Result {
}
一旦可以作为参数T传递的每个类(或它们的公共超类型)都被注释了,Jackson将在JSON中包含关于参数T的信息。这样的JSON可以在编译时不知道参数T的情况下进行反序列化。 Jackson文档链接讨论了多态反序列化,但对于这个问题也很有用。
您需要为所使用的每个泛型类型创建一个TypeReference对象,并使用该对象进行反序列化。例如:
mapper.readValue(jsonString, new TypeReference<Data<String>>() {});
你要做的第一件事是序列化,然后你可以反序列化。 所以当你序列化时,你应该使用@JsonTypeInfo让jackson把类信息写进你的json数据。你可以这样做: 类数据<T> { int发现; @JsonTypeInfo(使用= JsonTypeInfo.Id.CLASS,包含= JsonTypeInfo.As。财产,财产= " @class”) 类< T > } 然后当你反序列化时,你会发现jackson已经将你的数据反序列化为一个类,你的变量在运行时实际上是命中的。
只需在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);