私の Json 文字列は、次の 2 つの形式のいずれかである可能性があります。JsonArray か JsonObject かがわからないため、どのように解析すればよいでしょうか。
{"a":{"a":"a","a":"a","a":"a","a":"a"}}
{"a":[{"a":"a","b":"a","a":"a","a":"a"},{"b":"b","b":"b","b":"b","b":"b"}]}
ありがとう。
トークン ストリームの解析のアイデアを提供するサンプル コード
これは初期トークンで呼び出され、
nextToken(t) は、ストリームから次のトークンを取得します。
parseJsonElement は、ツリーの性質を処理するために再帰的です。
public Object parseJsonElement(Token t){
if (t.isArrayStart()){
// is an array so create list and put child elements into list
List list = new List();
t = nextToken(t);
while (!t.isArrayEnd()){
list.add(parseJsonElement(t));
}
return list;
}else if (t.isObjectStart()){
// is an object so return parsed object
return parseJsonElement(t);
}else // handle something else
}
Gsonを使用して JSON を解析していると仮定して、JsonParserを作成します。そのparse
メソッドの戻り値の型はJsonElementです。クラスのメソッド リストを読むとわかるように、オブジェクト、配列、その他のいずれであるかを示すメソッドがあります。その後、オブジェクトを適切なサブクラス ( JsonObject
、JsonArray
など) にケース化するか、提供された便利なメソッドを使用してそれを行うことができます。
そこから、オブジェクトまたは配列を調べて、プロパティ、要素、プリミティブ値などを取得できます。これらも JsonElement として出力されます。
JSONLib または Gson を使用している場合、両方のライブラリに JsonElement という抽象クラスがあります。そのクラスには、JsonObject または JsonArray (#isJsonArray() #isJsonObject() メソッド) である場合に応答する機能があります。すると、ちゃんとキャストできます。