使用Jackson将JSON反序列化为ArrayList <POJO>
我有一个Java类MyPojo
,我有兴趣从JSON反序列化。 我已经configuration了一个特殊的MixIn类MyPojoDeMixIn
来协助我进行反序列化。 MyPojo
只有int
和String
实例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 ; } }
- jacksonJSON自定义序列化的某些领域
- 序列化/反序列化java 8jacksonJSON映射器的java.time
- Spring REST服务:如何configuration删除json响应中的空对象
- jackson-core-asl和jackson-core-lgpl有什么区别?
- 序列化与jackson(JSON) – 得到“没有串行器发现”?
- jackson真的无法将json反序列化成generics?
- 将JSONstring转换为使用Jackson的漂亮打印JSON输出
- Spring REST多个@RequestBody参数,可能吗?
- 如何在Wildfly中configurationJackson?