Unfortunately, Date and Integer values deserialize as String and Double.
当您定义类似Field< T>的泛型类型字段时 – Gson无法获得关于如何将某个值反序列化为某种类型的足够信息.这是一个基本的限制:没有类型信息.因此,Gson解析了< T>.好像它被参数化为< Object>.当某个目标“slot”(列表元素,对象字段等)被认为是java.lang.Object时,Gson根据值文字的类型解析一个JSON值:如果它类似于“…”,则它是可能是字符串;如果它是0,那么它肯定是一个数字,更准确:双(双精度是最大的标准数值–Gson只是节省了数字类型检测的时间,解析用户代码应该有java.util.List< Number>并使用instanceof检测特定的列表元素 – 它可能是一个整数,一个long或double值 – 使用起来不是很方便,因此java.lang.Double是默认策略).所以你有字符串和双精度而不是日期和整数:Gson simple本身不能拥有你想要的类型信息.
为什么不能直接使用类型标记:类型标记用于为相同类型的元素指定类型参数,因此即使对于双元素列表,也不能有多个类型标记来覆盖不同类型(列表类型标记为所有类型定义类型列表元素).
要完成您的需要,您可以创建一个类型适配器和相应的类型适配器工厂来执行某种查找以解决具体类型.说,
final class FilterTypeAdapterFactory
implements TypeAdapterFactory {
// This is a strategy up to your needs: resolve a java.lang.reflect.Type by a filter object content
private final Function super JsonObject, ? extends Type> typeResolvingStrategy;
private FilterTypeAdapterFactory(final Function super JsonObject, ? extends Type> typeResolvingStrategy) {
this.typeResolvingStrategy = typeResolvingStrategy;
}
static TypeAdapterFactory getFilterTypeAdapterFactory(final Function super JsonObject, ? extends Type> typeResolvingStrategy) {
return new FilterTypeAdapterFactory(typeResolvingStrategy);
}
@Override
public TypeAdapter create(final Gson gson, final TypeToken typeToken) {
// Is it the Fil