我正在尝试使用 JSON 对象使用 Gson 转换为 Java 对象(使用 AutoValue 构建)。JSON 对象如下所示:
{
"id": 1,
"name": "Nutella Pie",
"ingredients": [
{
"quantity": 2,
"measure": "CUP",
"ingredient": "Graham Cracker crumbs"
},
...
],
"steps": [
{
"id": 5,
"shortDescription": "Finish filling prep"
},
...
]
}
所以 Java 类(使用 AutoValue 构建)看起来像:
@AutoValue
public abstract class Recipe {
@SerializedName("id")
abstract int id();
@SerializedName("name")
abstract String name();
@SerializedName("ingredients")
abstract List<Ingredient> ingredients();
@SerializedName("steps")
abstract List<Step> steps();
public static TypeAdapter<Recipe> typeAdapter(Gson gson) {
return new AutoValue_Recipe.GsonTypeAdapter(gson);
}
}
中的create
方法TypeAdapterFactory
是:
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
Class<? super T> rawType = type.getRawType();
if (rawType.equals(Ingredient.class)) {
return (TypeAdapter<T>) Ingredient.typeAdapter(gson);
}
if (rawType.equals(Recipe.class)) {
return (TypeAdapter<T>) Recipe.typeAdapter(gson);
}
if (rawType.equals(Step.class)) {
return (TypeAdapter<T>) Step.typeAdapter(gson);
}
return null;
}
但是,我遇到了错误:
NoSuchMethodError:没有静态方法 getParameterized
这getParameterized
是一种GsonTypeAdapter
方法,显然没有实现。
如果我将 JSON 和 Java 类更改为嵌套对象而不是嵌套对象列表,则可以正常工作。
我不知道发生了什么事。有任何想法吗?
编辑:我取得了一些进展。根据 AutoValue GSON 扩展 文档:
要支持具有通用参数的字段(例如 List),您需要将 Gson 依赖项升级到至少 2.8.0,这会引入帮助器 TypeToken.getParameterized() 请参阅 Gson Changelog。
这样,我生成类型适配器的代码是:
public static <Ingredient,Step> TypeAdapter<Recipe<Ingredient,Step>> typeAdapter(Gson gson,
TypeToken<? extends Recipe<Ingredient,Step>> typeToken) {
return new AutoValue_Recipe.GsonTypeAdapter(gson,typeToken);
}
但是,我在 TypeAdapterFactory 上使用它时遇到问题,因为它必须返回 a TypeAdapter<T>
,而不是 a TypeAdapter<Recipe<Ingredient,Step>>
。尝试铸造,但没有成功。
我该怎么办?添加一个新的 TypeAdapterFactory?