gpt4 book ai didi

java - 使用 Java 泛型的 GSON

转载 作者:行者123 更新时间:2023-12-01 12:50:14 27 4
gpt4 key购买 nike

我正在尝试使用 GSON library 正确调用 fromJSON 方法。

public <T> T fromJSON( String object, Class<T> classObject )
{
return gson.fromJson( object, classObject );
}

事实上,我有一些类,其中一个成员可以使用 Java 泛型来定义。例如我可以创建一个 new ValidationResult<User>(), ValidationResult<Image>() or ListResult<User>(), ListResult<Image>()等等...所以我面临的问题是我需要告诉 GSON 它应该使用哪个 T 。这是我遇到问题的地方,因为我当前的代码正在将 JSON 对象转换为 ValidationResultListResult ,但通用对象不被视为 User , Image等等。它只是转换为 LinkedTreeMap例如。

我尝试了在 Stackoverflow 中找到的一些答案,但仍然无法得到正确的结果。

Using a generic type with Gson
Google Gson - deserialize list<class> object? (generic type)
Deserializing Generic Types with GSON

有人能让我走上正确的道路吗?如果可能的话,分享一些我可以用作指南的代码。

最佳答案

由于类型删除ValidationResultValidationResult<User>是同一类型。永远只有一个Class该类型的对象。因为Gson只知道ValidationResult通过那个Class对象,它必须使用泛型类型的默认值。在本例中,它使用 LinkedHashMap

最简单的解决方案是提供 TypeToken ,这是一种绕过类型删除的 hack(但不是真的)。你可以像这样使用它

gson.fromJson(json, new TypeToken<ValidationResult<User>>() {}.getType());

通过Type ,Gson 可以访问泛型类型参数。请注意我如何对类型 User 进行硬编码作为一个论点。您必须在此处使用实际类型,Gson 才能获取实际类型。如果您使用泛型类型参数,Gson 将获取泛型类型参数作为值,并且再次不知道如何使用它。我解释一下原因here

另一个解决方案是创建 ValidationResult 的子类型喜欢

public class UserValidationResult extends ValidationResult<User> {}

并传递Class您的方法的对象。

关于java - 使用 Java 泛型的 GSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24277718/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com