为货币对象使用 ReflectiveTypeAdapter

Use ReflectiveTypeAdapter for Currency Object

在旧版本的 Gson (<2.5.0) 中,反射类型适配器用于反序列化 java.util.Currency 对象。所以我有类似的东西:“{“currencyCode”:“USD”}”保存在数据库中。

现在,我想将 Gson 升级到更高版本(它引入了一个新的 CurrencyTypeAdapterFactory - 它不再能够从我的数据库中反序列化对象)。

有什么方法可以强制 Gson 对货币使用相同的反射类型适配器 class?

可以使用类似这样的东西为所需的 class 提供特定类型的适配器绑定:

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Currency.class, getCurrencyTypeAdapter());
gson = builder.create();

TypeAdapter<Currency> getCurrencyTypeAdapter() {
    ConstructorConstructor constructorConstructor = new ConstructorConstructor(Collections.emptyMap());
    JsonAdapterAnnotationTypeAdapterFactory jsonAdapterFactory = new JsonAdapterAnnotationTypeAdapterFactory(constructorConstructor);
    ReflectiveTypeAdapterFactory reflectiveTypeAdapterFactory = new ReflectiveTypeAdapterFactory(
        constructorConstructor, FieldNamingPolicy.IDENTITY, Excluder.DEFAULT, jsonAdapterFactory);
    return reflectiveTypeAdapterFactory.create(new Gson(), new TypeToken<Currency>() {});
}

这是一种解决方法。理想情况下,您应该修复 Currency class 的用法并使用内部使用的默认类型适配器:Currency.getInstance()