2017-07-19 168 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

相關問題