モデルクラスをどのように見せたいですか?
status
total
おそらくそうなるので、int
葉だけになりinfo
ます。
実験として、フィールドObject info
を追加して、Gsonがどのようにフィールドを設定するかを確認ArrayList<LinkedHashMap<String, String>>
します。キーでアクセスするのは醜くて難しいですが、すべてのデータがそこにあります。その情報を考えると、クラスをモデル化する最速の方法は次のようになります。
class Something {
int status;
List<Map<String, String> info;
int total;
}
そのJSONの生成方法を制御できる場合はinfo
、オブジェクトの配列からオブジェクトのみに構造を変更することをお勧め[{a:b},{c:d},{e:f}]
します{a:b,c:d,e:f}
。Map<String, String>
これにより、キーによるアクセスなどのすべての利点を備えたkeys()
にマップすることができますvalues()
。
class Something {
int status;
Map<String, String> info;
int total;
}
JSON形式を変更せずに後者のモデルクラスが必要な場合は、を作成する必要がありますTypeAdapter
(またはJsonDeserializer
、モデルクラスから生成するのではなく、JSONの解析のみに関心がある場合)。
これがJsonDeserializerハットで、元のinfo
JSONプロパティをプレーンにマップしますMap<String, String>
。
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
。
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(
new TypeToken<Map<String, String>>() {}.getType(),
new ArrayOfObjectsToMapDeserializer());
Gson gson = builder.create();
Map<String, String>
これにより、検出されたクラスに関係なく、任意のカスタムデシリアライザーが登録されることに注意してください。これが不要な場合は、カスタムTypeAdapterFactory
も作成し、デシリアライザーのインスタンスを返す前に宣言クラスを確認する必要があります。