基本写法,如果按照这种方式直接去写,那么Gson注册的TypeAdapter不会被执行
public static <K, V> Map<K, V> jsonToMap(String json, Class<K> kClass, Class<V> vClass) {
Type type = new TypeToken<Map<K, V>>() {}.getType();
return GSON.fromJson(json, type);
}
除非是写成固定的类型,不使用泛型去做就可以让注册的TypeAdapter执行,例:
public static <K, V> Map<K, V> jsonToMap(String json) {
Type type = new TypeToken<Map<String, Object>>() {}.getType();
return GSON.fromJson(json, type);
}
看源码,这个Type是个interface,TypeToken.getType()得到的是继承于他的interface ParameterizedType,而这个interface的实现是个private的,最主要的是方法getActualTypeArguments,如果使用泛型,这个方法得到的数组就是泛型K,V;不用泛型,就会得到实际的java.lang.String, java.lang.Object; 那么怎么把这个方法的返回值改修改成正确的呢??? 想到去重写一个ParameterizedType的实现类,然后作为Type向下传;
具体实现:
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;
public class ParameterizedTypeImpl implements ParameterizedType {
private final Type[] typeArguments;
private final Type rawType;
private final Type ownerType;
private final Class<?> kClass;
private final Class<?> vClass;
public ParameterizedTypeImpl(Class<?> kClass, Class<?> vClass) {
TypeToken<Map<?, ?>> typeToken = new TypeToken<Map<?, ?>>() {
};
ParameterizedType type = (ParameterizedType) typeToken.getType();
this.typeArguments = type.getActualTypeArguments();
this.rawType = type.getRawType();
this.ownerType = type.getOwnerType();
this.kClass = kClass;
this.vClass = vClass;
}
@Override
public Type[] getActualTypeArguments() {
this.typeArguments[0] = kClass; // 直接修改成固定的,如果需要精确一些,可以对class进行判断
this.typeArguments[1] = vClass;
return this.typeArguments;
}
@Override
public Type getRawType() {
return this.rawType;
}
@Override
public Type getOwnerType() {
return this.ownerType;
}
}
之后使用该类:
public static <K, V> Map<K, V> jsonToMap(String json, Class<K> kClass, Class<V> vClass) {
ParameterizedType type = new ParameterizedTypeImpl(kClass, vClass);
return GSON.fromJson(json, type);
}
由此,也可以使用泛型,成功对数据做序列化操作,而且可以执行到注册的TypeAdapter,完美解决