0

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token

I'm using fasterxml.jackson to pull data from json file and want to set them in POJO.
This is my Json File:

{"studentsjson":
    [
        {
            "name": "Henry  Lee",
            "course": "reading",
            "year": "2000",
            "grade": "3"
        },
        {
            "name": "John Flex",
            "course": "writing",
            "year": "2001",
            "grade": "4"
        }
    ]
}

and my pojo classes are:

import java.util.*;
import com.fasterxml.jackson.annotation.*;

@JsonRootName("studentsjson")
public class Students{
    List<StudentInfo> studentInfo;
    // getter and setter for above property
    public Students(){
        System.out.println("in Students constructor");
    }
} // end of students class

import com.fasterxml.jackson.annotation.*;

public class StudentInfo{
    String name;
    String course;
    int grade;
    int yob;
    // getters and setters       
    @Override
    public String toString() {
        return "Student [name=" + name + ", course=" + course + ", grade=" + grade + ",          yob=" + yob + "]";
    }

} // end of student class

This is my main method class:

@JsonIgnoreProperties(ignoreUnknown = true)
public class JsonReadJava{

    public static void main(String args[])throws JsonParseException, JsonMappingException, IOException
    {
    try{
        Path path = Paths.get("C:/Users/Radhika/Desktop/JavaJson/studentinfo.json.txt");
        byte[] fileasbytes =  Files.readAllBytes(path);
        String JsonAsString = new String(fileasbytes, "UTF-8");
        System.out.println("bytes[]asString: "+ JsonAsString);


        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.configure(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

        JavaType type = mapper.getTypeFactory().constructCollectionType(List.class, Students.class);
        List<Students> stuList = (ArrayList<Students>)mapper.readValue(JsonAsString, type);

        System.out.println("student is:"+stuList);

    }
    catch(Exception e){
        e.printStackTrace();
    }
    }//end of main
}//end of class

 JsonReadJava.java:34: error: cannot find symbol
    mapper.configure(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, tru
    e);
                                      ^
      symbol:   variable Feature
     location: class DeserializationConfig
    Note: JsonReadJava.java uses unchecked or unsafe operations.
    Note: Recompile with -Xlint:unchecked for details.
    1 error

   com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instanc
   e of java.util.ArrayList out of START_OBJECT token
    at [Source: {"studentsjson":[
    { "name":"Henry  Lee", "course":"reading", "year":"2000", "grade":"3"},
    { "name":"John Flex", "course":"writing", "year":"2001", "grade":"4"}
    ]
    }

    ; line: 1, column: 1]
        at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingE
    xception.java:164)
        at com.fasterxml.jackson.databind.DeserializationContext.mappingExceptio
    n(DeserializationContext.java:749)
        at com.fasterxml.jackson.databind.DeserializationContext.mappingExceptio
    n(DeserializationContext.java:745)
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handl
    eNonArray(CollectionDeserializer.java:273)
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deser
    ialize(CollectionDeserializer.java:216)
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deser
    ialize(CollectionDeserializer.java:206)
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deser
    ialize(CollectionDeserializer.java:25)
        at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMa
    pper.java:3051)
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.ja
    va:2160)
        at JsonReadJava.main(JsonReadJava.java:36)

      C:\Users\Radhika\Desktop\JavaJson>javac *.java
    JsonReadJava.java:34: error: cannot find symbol
     mapper.configure(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, tru
     e);
                                      ^
         symbol:   variable Feature
      location: class DeserializationConfig
    Note: JsonReadJava.java uses unchecked or unsafe operations.
     Note: Recompile with -Xlint:unchecked for details.
     1 error
1
  • @unihedron I didnot get you, I'm sorry.. You can see all code and detailed exception pasted above :) any clue where I'm going wrong? Commented Jul 7, 2014 at 23:42

1 Answer 1

1

The following is IMHO a simpler way of deserializing to Students:

public class Students {

    @JsonProperty(value="studentsjson")
    private List<StudentInfo> studentInfo;
   .....
}

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

Students students = mapper.readValue(JsonAsString, Students.class);
System.out.println("student is:"+students);
Sign up to request clarification or add additional context in comments.

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.