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什么对象。