2017-07-19 26 views
0

私は初めてJSONを使用しています.JSONファイルをJavaオブジェクトにデシリアライズしようとしています。ジャクソンを使用して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オブジェクトにマップします。

私がしたいことは、studentIdをキーとして、各studentIdに対応する値としてコースリストを作成することです。

私のリストは1つの要素しか得られないので、リストのサイズは1です。マップの作成にも問題があります。 助けていただければ幸いです。

答えて

0

このJavaクラスは間違っています。変数名がJSONオブジェクトと同じではないためです。

ObjectMapper objectMapper = new ObjectMapper(); 

単一学生オブジェクトの解析の場合:

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

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でマッピングを行うにはいくつかの方法があります

生徒オブジェクトwhiのリストを解析するため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を持つ地図です。したがって、生徒オブジェクトは1つだけです。それは、キーが学生IDであり、値が対応するコースリストであるマップを有する。 – laksh

+0

私はちょうど私の答えを更新しました。特定のケースでは、objectMapper.getTypeFactory()を使用する方法を調整できます。constructType ...適用される場合もあれば、適用されない場合もあります。あなたはあなたの特定の目的のためにそれを試す必要があります。私の言うところでは、リスト解析はこの場合に必要なものです。 – NNguyen

関連する問題