我有一个Java类MyPojo,我对从JSON反序列化感兴趣。我已经配置了一个特殊的MixIn类MyPojoDeMixIn,以帮助我进行反序列化。MyPojo只有int和String实例变量与适当的getter和setter方法相结合。MyPojoDeMixIn看起来像这样:
MyPojo
MyPojoDeMixIn
int
String
public abstract class MyPojoDeMixIn { MyPojoDeMixIn( @JsonProperty("JsonName1") int prop1, @JsonProperty("JsonName2") int prop2, @JsonProperty("JsonName3") String prop3) {} }
在我的测试客户端中,我执行以下操作,但是在编译时它当然不起作用,因为JsonMappingException与类型不匹配有关。
JsonMappingException
ObjectMapper m = new ObjectMapper(); m.getDeserializationConfig().addMixInAnnotations(MyPojo.class,MyPojoDeMixIn.class); try { ArrayList<MyPojo> arrayOfPojo = m.readValue(response, MyPojo.class); } catch (Exception e) { System.out.println(e) }
我知道我可以通过创建一个仅包含一个“响应”对象的方法来缓解此问题ArrayList<MyPojo>,但是随后我将不得不为我想返回的每种类型创建这些有点无用的对象。
ArrayList<MyPojo>
我也在线查看了JacksonInFiveMinutes,但是却很难理解这些问题Map<A,B>及其与我的问题的关系。如果您无法确定,我是Java的新手,并且来自Obj- C背景。他们特别提到:
Map<A,B>
除了绑定到POJO和“简单”类型外,还有另一种变体:绑定到通用(类型化)容器。这种情况由于所谓的类型擦除(Java用来以某种向后兼容的方式实现泛型)而需要特殊的处理,这使您无法使用Collection.class之类的东西(不会编译)。 因此,如果要将数据绑定到地图中,则需要使用:
除了绑定到POJO和“简单”类型外,还有另一种变体:绑定到通用(类型化)容器。这种情况由于所谓的类型擦除(Java用来以某种向后兼容的方式实现泛型)而需要特殊的处理,这使您无法使用Collection.class之类的东西(不会编译)。
因此,如果要将数据绑定到地图中,则需要使用:
Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { });
我如何直接反序列化到ArrayList?
ArrayList
您可以使用TypeReference包装器直接反序列化为列表。示例方法:
TypeReference
public static <T> T fromJSON(final TypeReference<T> type, final String jsonPacket) { T data = null; try { data = new ObjectMapper().readValue(jsonPacket, type); } catch (Exception e) { // Handle the problem } return data; }
并且用于:
final String json = ""; Set<POJO> properties = fromJSON(new TypeReference<Set<POJO>>() {}, json);
TypeReference Javadoc