JsonMappingException同时读取json文件并使用jackson.fasterxml将其映射到pojo

时间:2014-07-07 23:26:41

标签: java json

  

com.fasterxml.jackson.databind.JsonMappingException:无法从START_OBJECT标记中反序列化java.util.ArrayList的实例

我使用fasterxml.jacksonjson文件中提取数据,并希望在POJO中设置它们。
这是我的Json文件:

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

我的pojo课程是:

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

这是我的主要方法类:

@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 个答案:

答案 0 :(得分:1)

以下是恕我直言,一种更简单的反序列化方式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);