Я преодолел аналогичную проблему с пользовательским JsonDeSerializer. Я попытался сделать это немного общим, но все еще недостаточно. Это решение, хотя и соответствует моим потребностям.
Прежде всего вам необходимо реализовать новый JsonDeserializer для объектов Map.
public class MapDeserializer<T, U> implements JsonDeserializer<Map<T, U>>
И метод десериализации будет выглядеть примерно так:
public Map<T, U> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
if (!json.isJsonObject()) {
return null;
}
JsonObject jsonObject = json.getAsJsonObject();
Set<Entry<String, JsonElement>> jsonEntrySet = jsonObject.entrySet();
Map<T, U> deserializedMap = new HashMap<T, U>();
for (Entry<java.lang.String, JsonElement> entry : jsonEntrySet) {
try {
U value = context.deserialize(entry.getValue(), getMyType());
deserializedMap.put((T) entry.getKey(), value);
} catch (Exception ex) {
logger.info("Could not deserialize map.", ex);
}
}
return deserializedMap;
}
Недостаток этого решения в том, что ключ моей карты всегда имеет тип "String". Однако, изменяя некоторые вещи, кто-то может сделать это общим. Кроме того, я должен сказать, что класс значения должен быть передан в конструкторе. Таким образом, метод getMyType()
в моем коде возвращает тип значений Map, которые были переданы в конструктор.
Вы можете сослаться на этот пост Как написать собственный десериализатор JSON для Gson? , чтобы узнать больше о пользовательских десериализаторах.