Gson 反序列化时,TypeAdapter不被执行的问题解决方案

基本写法,如果按照这种方式直接去写,那么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,完美解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值