4

我正在尝试使用 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?

4

1 回答 1

3

NoSuchMethodError: No static method getParameterized

我假设您使用com.ryanharter.auto.value:auto-value-gson:0.4.6的是 2.8.0 之前的 Gson 版本。您遇到了异常,因为 AutoValue 生成器在后台使用 Gson 2.8.0,并引入了 Gson 2.8.0 TypeToken.getParameterized(请参阅提交9414b9b3b61d59474a274aab21193391e5b97e52)。并且在运行时 JVM 期望您的Gson 提供该TypeToken.getParameterized方法。由于您似乎有较旧的 Gson 版本,因此会引发错误。

在 auto-value-gson文档中也有关于 Gson 2.8.0 的注释:

您还需要 gson 本身的正常运行时依赖项。

compile 'com.google.code.gson:gson:2.8.0'

如果您使用的是 Apache Maven,只需确保您拥有最新的 Gson:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.0</version>
</dependency>

这应该有效。如果由于某种原因无法升级 Gson,请尝试降级 AutoValue Gson 生成器。

于 2017-05-24T10:01:16.340 回答