0

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

2 Answers 2

1

I am considering that you already have 2 jars i.e. 1. Jackson Core 2. Jackson Mapper

So for Parsing from JSON to Your POJO

    ObjectMapper mapper = new ObjectMapper();
    JavaType javaType=mapper.getTypeFactory().constructType(JacksonFields.class);

    JacksonFields jksnflds = mapper.readValue(jsonString,javaType);

and thats it !.

Sign up to request clarification or add additional context in comments.

Comments

0

To deserialize the JSON you should have 3 class like

class Field{
int id1;
int id2;
int count;
int format;
String type;
int flags;
int group;
String value;

} 
class Result{
int id1;
int id2;
Field[] fields;
}

class JacksonFields {
String flags;
Result result; 

}

Then you can write code like

JacksonFields jackobj = objmapper.readValue(new BufferedReader(new inputStreamReader(ipStream)), JacksonFields.class);

Then it will work. Note:-I did not provide proper annotation to the classes you can provide those.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.