为货币对象使用 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()
在旧版本的 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()