Ответ 1
Если вам действительно нужно сохранить класс Holder
как есть, единственный вариант, о котором я могу думать, - создать собственный десериализатор для вашего класса Holder
.
Таким образом, всякий раз, когда вы говорите Gson для разбора некоторого JSON в объекте Holder
, он будет использовать ваш десериализатор вместо того, чтобы делать это "обычным способом" (т.е. сопоставление ключей JSON с объектными свойствами).
Что-то вроде этого:
private class HolderDeserializer implements JsonDeserializer<Holder> {
@Override
public Holder deserialize(JsonElement json, Type type, JsonDeserializationContext context)
throws JsonParseException {
Type mapType = new TypeToken<Map<String, String>>() {}.getType();
Map<String, String> data = context.deserialize(json, mapType);
return new Holder(data);
}
}
Затем вы регистрируете свой десериализатор при создании объекта Gson
:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Holder.class, new HodlerDeserializer());
Gson gson = gsonBuilder.create();
И, наконец, вы разбираете свой JSON следующим образом:
Type responseType = new TypeToken<Map<String, Holder>>() {}.getType();
Map<String, Holder> response = gson.fromJson(jsonLine, responseType);
Вы можете посмотреть документы Gson для пользовательских (de) serialization и этот другой ответьте, чтобы узнать больше...
Примечание: этот ответ был отредактирован, чтобы сделать его более понятным после обсуждения в комментариях/чате.