38

GSONを使用してJavaでこのJSONファイルを解析したい:

{
    "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/に従いましたが、ルート要素と子要素を持つ場合は示されていません。

4

3 に答える 3

53

Imo、JSON 応答を GSON で解析する最良の方法は、応答を「一致」させて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);

yourJsona String、 any 、ReaderaJsonReaderまたは aのいずれかJsonElementです。

最後に、特定のフィールドにアクセスしたい場合は、次のようにするだけです。

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

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

于 2013-05-04T20:43:41.660 に答える
2

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

Gson JsonReader のドキュメントでは、 JsonObjectsandの解析を処理する方法について説明していますJsonArrays

  • 配列処理メソッド内で、最初に beginArray() を呼び出して、配列の開き括弧を消費します。次に、値を累積する while ループを作成し、hasNext() が false のときに終了します。最後に、endArray() を呼び出して、配列の閉じ括弧を読み取ります。
  • オブジェクト処理メソッド内で、最初に beginObject() を呼び出して、オブジェクトの左中かっこを消費します。次に、名前に基づいてローカル変数に値を割り当てる while ループを作成します。hasNext() が false の場合、このループは終了する必要があります。最後に、endObject() を呼び出して、オブジェクトの右中括弧を読み取ります。
于 2014-03-27T19:15:17.393 に答える