モデルクラスをどのように見たいですか?
status
およびtotal
はおそらくint
となるので、葉はinfo
となります。
実験として、フィールドObject info
を追加して、GsonがArrayList<LinkedHashMap<String, String>>
に設定する方法を見てください。醜いですが、キーでアクセスするのは難しいですが、すべてのデータはそこにあります。その情報を考えると、クラスをモデル化するための最速の方法は次のようになります。
class Something {
int status;
List<Map<String, String> info;
int total;
}
あなたはそのJSONを生成する方法を管理している場合は、私はちょうどオブジェクト{a:b,c:d,e:f}
にオブジェクト[{a:b},{c:d},{e:f}]
の配列からinfo
の構造を変更することをお勧め。これで、あなただけのキーによるアクセスなどのすべての利点とMap<String, String>
、keys()
とvalues()
にマップできます。
class Something {
int status;
Map<String, String> info;
int total;
}
あなたはJSON形式を変更することなく、後者のモデルクラスを使用する場合は、あなたが記述する必要がありますTypeAdapter
(またはJSONの解析に興味があり、モデルクラスから生成しない場合はJsonDeserializer
)
ここでは、オリジナルのinfo
JSONプロパティをプレーンMap<String, String>
にマップするJsonDeserializerハットを示します。これは、それが発生したものをクラスに関係なく、すべてのMap<String, String>
のカスタムデシリアライザを登録すること
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(
new TypeToken<Map<String, String>>() {}.getType(),
new ArrayOfObjectsToMapDeserializer());
Gson gson = builder.create();
注:
class ArrayOfObjectsToMapDeserializer
implements JsonDeserializer<Map<String, String>> {
public Map<String, String> deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
Map<String, String> result = new HashMap<String, String>();
JsonArray array = json.getAsJsonArray();
for (JsonElement element : array) {
JsonObject object = element.getAsJsonObject();
// This does not check if the objects only have one property, so JSON
// like [{a:b,c:d}{e:f}] will become a Map like {a:b,c:d,e:f} as well.
for (Entry<String, JsonElement> entry : object.entrySet()) {
String key = entry.getKey();
String value = entry.getValue().getAsString();
result.put(key, value);
}
}
return result;
}
}
あなたはこれに似たこのカスタムJsonDeserializer
を登録する必要があります。これを望まない場合は、カスタムTypeAdapterFactory
を作成して、デシリアライザを返す前に宣言クラスをチェックする必要があります。
?私はキーの内容が動的かもしれないと思った...自分でjsonの文字列を手動で生成していますか? – waqaslam