2017-07-19 189 views
0

我第一次使用JSON,并试图将JSON文件反序列化为Java对象。使用Jackson反序列化JSON到Java

InputJSON

{ 

    "student_id" : "123", 
    "courses":[ 
     { 
     "course_id":"789", 
     "professor":"abc" 
     } 
     ] 
} 
{ 
    "student_id":"234", 
    courses:[ 
     { 
     "course_id":"789", 
     "professor":"pqr" 
     }, 
     { 
     "course_id":"789", 
     "professor":"xyz" 
     } 
    ] 
} 
{ 
    "student_id" : "345", 
    "courses":[ 
     { 
     "course_id":"567", 
     "professor":"lmn" 
     } 
     ] 
} 

Student.class

class Student { 

    @JsonProperty("student_id") 
    private String studentId; 
    @JsonProperty("courses") 
    private List<Courses> courses; 

    //getters and setters 

} 

Courses.class

public class Courses { 

    @JsonProperty("course_id") 
    private String courseId; 
    @JsonProperty("professor") 
    private String professor; 

    //getters and setters 
} 

JsonHelper.class创建Object Mapper类的对象并使用readValue(new File(“Input.json”),Student.class)将json字段映射到Java对象。

我想要做的是创建一个map,将studentId作为关键字,将课程列表作为每个studentId对应的值。

我并不完全知道如何实现它,因为我的列表只能获得1个元素,列表大小因此为1。 任何帮助将不胜感激。

回答

0

这个java类看起来不对。因为你的变量名与你的JSON对象不一样。

public class Courses { 
    @JsonProperty("course_id") 
    private String courseId; 
    @JsonProperty("professor") 
    private String professor; 
    //getters and setters 
} 

它会是这样,

class Student { 
    @JsonProperty("student_id") 
    private String student_id; 
    @JsonProperty("courses") 
    private List<Courses> courses; 
    //getters and setters 

    } 
    public class Courses { 
      @JsonProperty("course_id") 
      private String course_id; 
      @JsonProperty("professor") 
      private String professor; 
      //getters and setters 
     } 
+0

我想既然映射是由注解来实现的变量名在这里不是一个问题。 – laksh

0

这里有一些方法做ObjectMapper映射:

ObjectMapper objectMapper = new ObjectMapper(); 

为了解析一个Student对象:

Student student = objectMapper.readValue(inputJSONString, Student.class); 

用于解析Student对象列表CH是你想要什么:

List<Student> students = objectMapper.readValue(inputJSONString, objectMapper.getTypeFactory().constructCollectionType(List.class, Student.class)); 

用于解析图:

Map<String, Courses> maps = objectMapper.readValue(inputJSONString, objectMapper.getTypeFactory().constructMapType(Map.class, String.class, Courses.class)); 
+0

我觉得我的语言在这个问题上有点含糊。所以我实际上试图创建一个带有每个学生ID的地图。所以只有一个学生对象。它有一张地图,其中的键是学生ID,值是相应的课程列表。 – laksh

+0

我刚刚更新了我的答案。对于特定的情况,您可以调整使用objectMapper.getTypeFactory()。constructType ...的方式有些可能适用,有些可能不适用。你需要为你的特定目的尝试一下。从我的观点来看,在这种情况下,列表解析就是你需要的。 – NNguyen

相关问题