GsonBuilder的registerTypeAdapter方法抛出IllegalArgumentException异常。

9
我是这样调用方法的:

GsonBuilder gsonBuilder = new GsonBuilder()
        .registerTypeAdapter(CoindeskRateResult.class, CurrencyRateDeserializer.class)

货币汇率反序列化器是一个 com.google.gson.JsonDeserializer。
import com.google.gson.JsonDeserializer;

    public class CurrencyRateDeserializer implements JsonDeserializer<CoindeskRateResult> {
        @Override
        public CoindeskRateResult deserialize(JsonElement json, Type typeOfT,
                                              JsonDeserializationContext context)
                throws JsonParseException {
            CoindeskRateResult result = new CoindeskRateResult();
            return result;
        }
    }

错误出现在GsonBuilder类中。我知道typeAdapterJsonDeserializer<?>的一个实例,但$Gson$Preconditions.checkArgument会抛出一个IllegalArgumentException

  public GsonBuilder registerTypeAdapter(Type type, Object typeAdapter) {
    $Gson$Preconditions.checkArgument(typeAdapter instanceof JsonSerializer<?>
            || typeAdapter instanceof JsonDeserializer<?>
            || typeAdapter instanceof InstanceCreator<?>
            || typeAdapter instanceof TypeAdapter<?>);
....

堆栈跟踪:

*Caused by: java.lang.IllegalArgumentException
                at com.google.gson.internal.$Gson$Preconditions.checkArgument($Gson$Preconditions.java:46)
                at com.google.gson.GsonBuilder.registerTypeAdapter(GsonBuilder.java:472)*
    .....

我的CoindeskRateResult类:

public class CoindeskRateResult {
    public Map<String, String> data = new HashMap<>();
}
1个回答

12

这是错误的:

.registerTypeAdapter(CoindeskRateResult.class, CurrencyRateDeserializer.class)
这就是为什么所有针对第一种情况的instanceof检查都会失败。你需要找到的是:
.registerTypeAdapter(CoindeskRateResult.class, new CurrencyRateDeserializer())

说实话,我认为这是Gson的设计缺陷。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接