使用Jackson将JSON反序列化为ArrayList <POJO>

我有一个Java类MyPojo ,我有兴趣从JSON反序列化。 我已经configuration了一个特殊的MixIn类MyPojoDeMixIn来协助我进行反序列化。 MyPojo只有intString实例variables与正确的getter和setter相结合。 MyPojoDeMixIn看起来像这样:

 public abstract class MyPojoDeMixIn { MyPojoDeMixIn( @JsonProperty("JsonName1") int prop1, @JsonProperty("JsonName2") int prop2, @JsonProperty("JsonName3") String prop3) {} } 

在我的testing客户端中,我执行以下操作,但是当然,它在编译时不起作用,因为存在与types不匹配有关的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) } 

我意识到我可以通过创build一个只有一个ArrayList<MyPojo> Response对象来缓解这个问题,但是我必须为每一个我想要返回的types创build这些有些无用的对象。

我也在网上看了一下JacksonInFiveMinutes,但是很难理解Map<A,B> ,以及它与我的问题之间的关系。 如果你不能说,我完全不熟悉Java,来自Obj-C背景。 他们特别提到:

除了绑定到POJO和“简单”types之外,还有一个额外的变体:绑定到generics(键入)的容器。 这种情况需要特殊的处理,因为所谓的Type Erasure(被Java用来以一种向后兼容的方式来实现generics),这会阻止你使用类似Collection.class(不能编译)的东西。

所以如果你想要将数据绑定到一个Map,你将需要使用:

 Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { }); 

我怎样才能直接反序列化ArrayList

您可以使用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); 

types引用Javadoc

另一种方法是使用数组作为types,例如:

 ObjectMapper objectMapper = new ObjectMapper(); MyPojo[] pojos = objectMapper.readValue(json, MyPojo[].class); 

这样,您可以避免使用Type对象带来的麻烦,如果您确实需要列表,则始终可以通过以下方式将数组转换为列表:

 List<MyPojo> pojoList = Arrays.asList(pojos); 

恕我直言,这是更可读。

为了使它成为一个实际的列表(可以修改,请参阅Arrays.asList()限制),然后执行以下操作:

 List<MyPojo> mcList = new ArrayList<>(Arrays.asList(pojos)); 

这个变种看起来更简单和优雅。

 CollectionType typeReference = TypeFactory.defaultInstance().constructCollectionType(List.class, Dto.class); List<Dto> resultDto = objectMapper.readValue(content, typeReference); 

我也有同样的问题。 我有一个要转换为ArrayList的json。

帐户看起来像这样。

 Account{ Person p ; Related r ; } Person{ String Name ; Address a ; } 

以上所有的类都已被正确注解。 我曾尝试TypeReference>(){}但不工作。

它给了我Arraylist,但是ArrayList有一个linkedHashMap,它包含一些包含最终值的更多链接的hashmaps。

我的代码如下:

 public T unmarshal(String responseXML,String c) { ObjectMapper mapper = new ObjectMapper(); AnnotationIntrospector introspector = new JacksonAnnotationIntrospector(); mapper.getDeserializationConfig().withAnnotationIntrospector(introspector); mapper.getSerializationConfig().withAnnotationIntrospector(introspector); try { this.targetclass = (T) mapper.readValue(responseXML, new TypeReference<ArrayList<T>>() {}); } catch (JsonParseException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return this.targetclass; } 

我终于解决了这个问题。 我能够将Jsonstring中的列表直接转换为ArrayList,如下所示:

 JsonMarshallerUnmarshaller<T>{ T targetClass ; public ArrayList<T> unmarshal(String jsonString) { ObjectMapper mapper = new ObjectMapper(); AnnotationIntrospector introspector = new JacksonAnnotationIntrospector(); mapper.getDeserializationConfig().withAnnotationIntrospector(introspector); mapper.getSerializationConfig().withAnnotationIntrospector(introspector); JavaType type = mapper.getTypeFactory(). constructCollectionType(ArrayList.class, targetclass.getClass()) ; try { Class c1 = this.targetclass.getClass() ; Class c2 = this.targetclass1.getClass() ; ArrayList<T> temp = (ArrayList<T>) mapper.readValue(jsonString, type); return temp ; } catch (JsonParseException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null ; } }