简体   繁体   中英

Deserializing a JSON array using Jackson

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

I am considering that you already have 2 jars ie 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 !.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM