Обновление: есть https://github.com/acebaggins/gson-serializers, который охватывает множество коллекций гуавы:
ImmutableList
ImmutableSet
ImmutableSortedSet
ImmutableMap
ImmutableSortedMap
Как написать один десериализатор, работающий для всех ImmutableList?
Идея проста: преобразовать переданный Type
, представляющий ImmutableList<T>
, в Type
, представляющий List<T>
, использовать встроенную Gson
возможность создать List
и преобразовать его в ImmutableList
.
class MyJsonDeserializer implements JsonDeserializer<ImmutableList<?>> {
@Override
public ImmutableList<?> deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
final Type type2 = ParameterizedTypeImpl.make(List.class, ((ParameterizedType) type).getActualTypeArguments(), null);
final List<?> list = context.deserialize(json, type2);
return ImmutableList.copyOf(list);
}
}
В библиотеках Java есть несколько ParameterizedTypeImpl
классов, которые я использую, но ни один из них не предназначен для публичного использования.Я протестировал его с помощью sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
.
Как зарегистрировать его для всех ImmutableList?
Эта часть тривиальна, первый аргумент для регистрации - java.lang.reflect.Type
, что вводит в заблуждениемне использовать ParameterizedType
, где просто с помощью Class
делает работу:
final Gson gson = new GsonBuilder()
.registerTypeAdapter(ImmutableList.class, myJsonDeserializer)
.create();