I am getting a JSON response from 3rd Party service provider and it has a array of objects in it. When i am trying to deserialize JSON using Jackson api's. I am getting following exception
com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of JacksonFields out of START_ARRAY token at [Source: java.io.BufferedReader@1015a9e; line: 5, column: 26] My JSON response is
{ "flags" : 1074200577, "results" : { "id1" : 0, "id2" : 0, "fields" : [ { "id1" : 19202, "id2" : 19202, "count" : 0, "format" : 8, "type" : "name", "flags" : 0, "group" : 1074, "value" : "1074" }, { "id1" : 19218, "id2" : 19218, "count" : 0, "format" : 8, "type" : "name", "flags" : 0, "group" : 1075, "value" : "1075" } ] } } And my POJO class looks like this
import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; class JacksonFields { int id1; int id2; int count; int format; String type; int flags; int group; String value; public JacksonFields(){ } @JsonCreator public JacksonFields(@JsonProperty("id1") int id1, @JsonProperty("id2") int id2, @JsonProperty("count") int count, @JsonProperty("format") int format, @JsonProperty("type") String type, @JsonProperty("flags") int flags, @JsonProperty("group") int group, @JsonProperty("value") String value){ this.id1 = id1; this.id2 = id2; this.count = count; this.format = format; this.type = type; this.flags = flags; this.group = group; this.value = value; } public void putId1(int id){ this.id1=id; } public void putId2(int id){ this.id2=id; } public void putCount(int count){ this.count=count; } public void putFormat(int format){ this.format=format; } public void putType(String type){ this.type=type; } public void putFlag(int flag){ this.flags=flag; } public void putGroup(int group){ this.group=group; } public void putValue(String val){ this.value=val; } } class JacksonResults { int id1; int id2; JacksonFields fields; @JsonCreator public JacksonResults(@JsonProperty("id1") int id1, @JsonProperty("id2") int id2, @JsonProperty("fields") JacksonFields fields){ this.id1 = id1; this.id2 = id2; this.fields = fields; } public JacksonResults(){ } public void putId1(@JsonProperty("id1") int id){ this.id1 = id; } public void putId2(@JsonProperty("id2") int id){ this.id2 = id; } public void putFields(@JsonProperty("fields") JacksonFields fie){ this.fields = fie; } } public class JacksonJsonObj{ Long flags; JacksonResults res; @JsonCreator public JacksonJsonObj(@JsonProperty("flags") long flags, @JsonProperty("results") JacksonResults res){ this.flags = flags; this.res = res; } public JacksonJsonObj(){ } public void putFlags(@JsonProperty("flags") long flag){ this.flags = flag; } public void putResults(@JsonProperty("results") JacksonResults res){ this.res=res; } } I am trying to deserialize JSON using following code
ObjectMapper objmapper = new ObjectMapper(); objmapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); JacksonJsonObj jackobj = objmapper.readValue(new BufferedReader(new inputStreamReader(ipStream)), JacksonJsonObj.class); if i try to do
JacksonJsonObj[] jackobj = objmapper.readValue(new BufferedReader(new inputStreamReader(ipStream)), JacksonJsonObj[].class); it fails at the BEGIN_OBJECT itself.
How to read and deserialize the JSON wiht Arrays. Should i write my own deserializer?
EDIT If i work on JSON String rather than stream i am able to get all Java objects back. But for better performance i want Jackson to work on stream
Alternate way
List<JsonFields> JsonFieldsJackson = new ArrayList<JsonFields>(); ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); JsonNode nodes = mapper.readTree(strbuffer.toString()); nodes.elements(); Iterator<JsonNode> iter = nodes.path("results").path("fields").elements(); while(iter.hasNext()){ JsonNode node = iter.next(); JsonFields fie = mapper.readValue(node.toString(),JsonFields.class); JsonFieldsJackson.add(fie); }