これを解析したい[〜#〜] 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/ ですが、ルートがある場合は表示されませんおよび子要素。
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);
yourJson
は String
、任意の Reader
、 JsonReader
または JsonElement
。
最後に、特定のフィールドにアクセスする場合は、次を実行するだけです。
String name = response.getDescriptor().get("app3").getName();
他の回答で提案されているように、JSONをいつでも手動で解析できますが、個人的には、このアプローチはより明確で、長期的に保守性が高く、JSONの全体のアイデアによりよく適合すると思います。
私は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();
}
}
このような問題を解決する際に覚えておくべきことの1つは、JSONファイルでは、{
はJSONObject
を示し、[
はJSONArray
を示すことです。それらを適切に管理できれば、JSONファイルを解析するタスクを簡単に達成できます。上記のコードは私にとって非常に役立ち、このコンテンツが上記のコードに何らかの意味を加えることを願っています。
Gson JsonReader documentation は、JsonObjects
およびJsonArrays
の解析の処理方法を説明しています。
- 配列処理メソッド内で、最初にbeginArray()を呼び出して、配列の開始ブラケットを使用します。次に、値を累積するwhileループを作成し、hasNext()がfalseのときに終了します。最後に、endArray()を呼び出して、配列の閉じ括弧を読み取ります。
- オブジェクト処理メソッド内で、まずbeginObject()を呼び出して、オブジェクトの開き括弧を消費します。次に、名前に基づいてローカル変数に値を割り当てるwhileループを作成します。 hasNext()がfalseの場合、このループは終了するはずです。最後に、endObject()を呼び出してオブジェクトの右中括弧を読み取ります。