jackson – 使用generics类反序列化

我有一个jsonstring,我应该将其序列化为以下类

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

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

 mapper.readValue(jsonString, Data.class); 

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

您需要为每个使用的genericstypes创build一个TypeReference对象,并将其用于反序列化。 例如,

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

你不能这样做:你必须指定完全parsing的types,如Data<MyType>T只是一个variables,而且没有意义。

但是,如果你的意思是T将被知道,而不是静态的,你需要dynamic地创buildTypeReference等价物。 其他提到的问题可能已经提到了这一点,但它应该看起来像这样:

 public Data<T> read(InputStream json, Class<T> contentClass) { JavaType type = mapper.getTypeFactory().constructParametricType(Data.class, contentClass.class); return mapper.readValue(json, type); } 

首先你要做的是序列化,然后你可以做反序列化。
所以当你做序列化的时候,你应该使用@JsonTypeInfo让jackson把类信息写入你的json数据。 你可以做的是这样的:

 Class Data <T> { int found; @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class") Class<T> hits } 

然后,当你反序列化时,你会发现jackson已经反序列化你的数据到一个类,你的variables命中实际上是在运行时。

只要在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); 

你可以把它包装在另一个知道你的genericstypes的类中。

例如,

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

这里的东西是一个具体的types。 你需要一个封装每个物化types。 否则,jackson不知道要创build什么对象。