Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Deserialize JSON to ArrayList<POJO> using Jackson

I have a Java class MyPojo that I am interested in deserializing from JSON. I have configured a special MixIn class, MyPojoDeMixIn, to assist me with the deserialization. MyPojo has only int and String instance variables combined with proper getters and setters. MyPojoDeMixIn looks something like this:

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

In my test client I do the following, but of course it does not work at compile time because there is a JsonMappingException related to a type mismatch.

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) } 

I am aware that I could alleviate this issue by creating a "Response" object that has only an ArrayList<MyPojo> in it, but then I would have to create these somewhat useless objects for every single type I want to return.

I also looked online at JacksonInFiveMinutes but had a terrible time understanding the stuff about Map<A,B> and how it relates to my issue. If you cannot tell, I'm entirely new to Java and come from an Obj-C background. They specifically mention:

In addition to binding to POJOs and "simple" types, there is one additional variant: that of binding to generic (typed) containers. This case requires special handling due to so-called Type Erasure (used by Java to implement generics in somewhat backwards compatible way), which prevents you from using something like Collection.class (which does not compile).

So if you want to bind data into a Map you will need to use:

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

How can I deserialize directly to ArrayList?

like image 558
tacos_tacos_tacos Avatar asked Mar 22 '12 19:03

tacos_tacos_tacos


People also ask

Does Jackson preserve array order?

Jackson mapper fill the ArrayList maintaining the order of JSON. If you want a different order you can use the annotation @JsonPropertyOrder.


1 Answers

You can deserialize directly to a list by using the TypeReference wrapper. An example method:

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; } 

And is used thus:

final String json = ""; Set<POJO> properties = fromJSON(new TypeReference<Set<POJO>>() {}, json); 

TypeReference Javadoc

like image 78
Perception Avatar answered Oct 05 '22 10:10

Perception