web-dev-qa-db-fra.com

Analyser le fichier JSON avec GSON

Je veux analyser ce [~ # ~] json [~ # ~] fichier dans Java en utilisant [~ # ~] gson [~ # ~] :

{
    "descriptor" : {
        "app1" : {
            "name" : "mehdi",
            "age" : 21,
            "messages": ["msg 1","msg 2","msg 3"]
        },
        "app2" : {
            "name" : "mkyong",
            "age" : 29,
            "messages": ["msg 11","msg 22","msg 33"]
        },
        "app3" : {
            "name" : "amine",
            "age" : 23,
            "messages": ["msg 111","msg 222","msg 333"]
        }
    }
}

mais je ne sais pas comment accéder à l'élément racine qui est: descripteur , après cela app3 élément et enfin l'élément name .

J'ai suivi ce tutoriel http://www.mkyong.com/Java/gson-streaming-to-read-and-write-json/ , mais il ne montre pas le cas d'avoir une racine et éléments de childs.

35
user1079425

Par ailleurs, le meilleur moyen d’analyser votre réponse JSON avec GSON serait de créer des classes qui "correspondent" à votre réponse, puis d’utiliser la méthode Gson.fromJson() .
Par exemple:

class Response {
    Map<String, App> descriptor;
    // standard getters & setters...
}

class App {
  String name;
  int age;
  String[] messages;
  // standard getters & setters...
}

Ensuite, utilisez simplement:

Gson gson = new Gson();
Response response = gson.fromJson(yourJson, Response.class);

yourJson peut être un String , tout Reader , un JsonReader ou un JsonElement .

Enfin, si vous souhaitez accéder à un domaine particulier, il vous suffit de faire:

String name = response.getDescriptor().get("app3").getName();

Vous pouvez toujours analyser manuellement le JSON comme suggéré dans d'autres réponses, mais personnellement, je pense que cette approche est plus claire, plus facile à gérer à long terme et qu'elle correspond mieux à l'idée même de JSON.

50
MikO

J'utilise gson 2.2.3

public class Main {

/**
 * @param args
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {

    JsonReader jsonReader = new JsonReader(new FileReader("jsonFile.json"));

    jsonReader.beginObject();

    while (jsonReader.hasNext()) {

    String name = jsonReader.nextName();
        if (name.equals("descriptor")) {
             readApp(jsonReader);

        }
    }

   jsonReader.endObject();
   jsonReader.close();

}

public static void readApp(JsonReader jsonReader) throws IOException{
    jsonReader.beginObject();
     while (jsonReader.hasNext()) {
         String name = jsonReader.nextName();
         System.out.println(name);
         if (name.contains("app")){
             jsonReader.beginObject();
             while (jsonReader.hasNext()) {
                 String n = jsonReader.nextName();
                 if (n.equals("name")){
                     System.out.println(jsonReader.nextString());
                 }
                 if (n.equals("age")){
                     System.out.println(jsonReader.nextInt());
                 }
                 if (n.equals("messages")){
                     jsonReader.beginArray();
                     while  (jsonReader.hasNext()) {
                          System.out.println(jsonReader.nextString());
                     }
                     jsonReader.endArray();
                 }
             }
             jsonReader.endObject();
         }

     }
     jsonReader.endObject();
}
}
20
Gere

Une chose à ne pas oublier lors de la résolution de tels problèmes est que, dans le fichier JSON, un { indique un JSONObject et un [ indique JSONArray. Si on pouvait les gérer correctement, il serait très facile d’analyser le fichier JSON. Le code ci-dessus a été vraiment très utile pour moi et j'espère que ce contenu ajoute une signification au code ci-dessus.

Le documentation Gson JsonReader explique comment gérer l’analyse de JsonObjects et de JsonArrays:

  • Dans les méthodes de traitement de tableau, appelez d’abord beginArray () pour utiliser le crochet d’ouverture du tableau. Créez ensuite une boucle while qui accumule des valeurs, terminant quand hasNext () est false. Enfin, lisez le crochet de fermeture du tableau en appelant endArray ().
  • Dans les méthodes de gestion des objets, appelez d’abord beginObject () pour utiliser l’accolade ouvrante de l’objet. Créez ensuite une boucle while qui attribue des valeurs aux variables locales en fonction de leur nom. Cette boucle devrait se terminer lorsque hasNext () est false. Enfin, lisez l'accolade de fermeture de l'objet en appelant endObject ().
2
VAMSHI PAIDIMARRI