2017-07-19 3 views
0

Je travaille avec JSON pour la première fois et j'essaye de désérialiser un fichier JSON en objets Java.Désérialisation de JSON en Java en utilisant Jackson

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 
} 

Mon JsonHelper.class crée un objet de la classe Object Mapper et utilise readValue (nouveau fichier ("Input.json"), Student.class) pour mapper les champs json aux objets Java. Ce que je veux faire est de créer une carte avec studentId comme une clé et la liste des cours comme la valeur correspondant à chaque studentId.

Je n'arrive pas exactement comment l'obtenir puisque ma liste est juste capable d'obtenir 1 élément et la taille de la liste est ainsi de 1. Et de créer aussi la carte. Toute aide sera appréciée.

Répondre

0

Cette classe Java semble incorrecte. parce que votre nom de variable n'est pas le même avec votre objet JSON.

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

ce serait comme ça,

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

Je pense que les noms de variables ne sont pas un problème puisque la cartographie est fait par annotations. – laksh

0

Voici quelques façons de faire la cartographie avec ObjectMapper:

ObjectMapper objectMapper = new ObjectMapper(); 

Pour l'analyse d'un seul objet étudiant:

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

Pour analyser une liste d'objets Student ch est ce que vous voulez:

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

Pour une analyse syntaxique des cartes:

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

Je pense que ma langue était un peu ambiguë dans la question. Donc, ce que je suis en train de créer est une carte avec chaque identifiant d'étudiant. Il n'y a donc qu'un seul objet étudiant. Il a une carte dans laquelle les clés sont des identifiants d'étudiant et les valeurs sont la liste correspondante des cours. – laksh

+0

Je viens de mettre à jour ma réponse. Pour un cas spécifique, vous pouvez ajuster la façon d'utiliser objectMapper.getTypeFactory(). ConstructType ... Certaines peuvent s'appliquer, d'autres non. Vous devez faire un essai pour votre but spécifique. De mon point de vue, l'analyse de la liste est ce dont vous avez besoin dans ce cas. – NNguyen