web-dev-qa-db-ja.com

GSONを使用してJSONファイルを解析する

これを解析したい[〜#〜] json [〜#〜]ファイルのJavaを使用して[〜#〜] 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"]
        }
    }
}

しかし、ルート要素にアクセスする方法がわかりません:descriptor、その後app3要素、最後にname要素。

私はこのチュートリアルに従いました http://www.mkyong.com/Java/gson-streaming-to-read-and-write-json/ ですが、ルートがある場合は表示されませんおよび子要素。

35
user1079425

Imo、GSONでJSON応答を解析する最良の方法は、応答に「一致する」クラスを作成してから Gson.fromJson() メソッドを使用することです。
例えば:

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

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

次に使用します:

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

yourJsonString 、任意の ReaderJsonReader または JsonElement

最後に、特定のフィールドにアクセスする場合は、次を実行するだけです。

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

他の回答で提案されているように、JSONをいつでも手動で解析できますが、個人的には、このアプローチはより明確で、長期的に保守性が高く、JSONの全体のアイデアによりよく適合すると思います。

50
MikO

私は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

このような問題を解決する際に覚えておくべきことの1つは、JSONファイルでは、{JSONObjectを示し、[JSONArrayを示すことです。それらを適切に管理できれば、JSONファイルを解析するタスクを簡単に達成できます。上記のコードは私にとって非常に役立ち、このコンテンツが上記のコードに何らかの意味を加えることを願っています。

Gson JsonReader documentation は、JsonObjectsおよびJsonArraysの解析の処理方法を説明しています。

  • 配列処理メソッド内で、最初にbeginArray()を呼び出して、配列の開始ブラケットを使用します。次に、値を累積するwhileループを作成し、hasNext()がfalseのときに終了します。最後に、endArray()を呼び出して、配列の閉じ括弧を読み取ります。
  • オブジェクト処理メソッド内で、まずbeginObject()を呼び出して、オブジェクトの開き括弧を消費します。次に、名前に基づいてローカル変数に値を割り当てるwhileループを作成します。 hasNext()がfalseの場合、このループは終了するはずです。最後に、endObject()を呼び出してオブジェクトの右中括弧を読み取ります。
2