【问题标题】:Gson How to covert json to Custom ClassGson如何将json转换为自定义类
【发布时间】:2015-08-23 15:46:02
【问题描述】:

以下内容:我需要使用 Java Gson 库从 json 中反序列化 A<B<C>>

我在这个模板(Json)中有一个响应的 api:

{code:string, message:string, data:(any json type/object/array)}

在 Java 中我定义了一个类来读取结果:

public class ApiResult <DATA> {
    public String code;
    public String message;
    public DATA data;
}

我还有另一个数据类:

public class Ball {
    public String color;
    public String weight;
}

我的一个 api 方法返回顶部模板中的球列表。 我用GSON.fromJson(reader, new TypeToken&lt;ApiResult&lt;List&lt;Ball&gt;&gt;&gt;() {}.getType());

但是Gson读取List&lt;com.google.gson.internal.LinkedTreeMap&gt;中的数据而不是List

我该如何解决这个问题?

【问题讨论】:

  • 您能edit 包含完整的 JSON 示例吗?
  • 是的,我想我曾经遇到过同样的问题...尝试声明public class BallListApiResult extends ApiResult&lt;List&lt;Ball&gt;&gt; - 我非常有信心这应该有效(因为我在项目中具有完全相同的结构),但是我无法解释为什么你的方式不......如果有人可以......会很酷......
  • 另一个问题是我有很多数据,不仅是 Ball 和 ...(因为我的每个 api 方法的 api 结构我都有不同的数据,顺便说一句,我需要许多自定义额外类来捕获它们)
  • 是的,但是这些类中的每一个都只有几行 - 我们还有大约 30 个 AbstractResponse&lt;T&gt; 的子类。但是你试过了吗?有用吗?
  • 在我当前的项目中,我有一种方法可以分析响应“代码”,然后返回data。如果我可以从 Class 制作 Class> 类并将其传递给 GSON.fromJson(reader, clazz) exept GSON.fromJson(reader,type) 它可以正常工作

标签: java json gson deserialization json-deserialization


【解决方案1】:

最后我解决了我的问题,但不是所有A&lt;B&lt;C&gt;&gt; 问题

我将ApiResult 类重新定义为:

public class ApiResult {
    public String code;
    public String message;
    public JsonElement data; 
}

使用result = GSON.fromJson(reader, ApiResult.class);我提取全局响应(所有api响应都返回这部分)。 并检查我需要的codemessage

然后我用final List&lt;Ball&gt; data = GSON.fromJson(result.data, new TypeToken&lt;List&lt;Ball&gt;&gt;() {}.getType()); 提取我想要的真实数据并返回它

我认为 Gson 的主要错误/限制是它只检查一次泛型类型的父类型,而不检查泛型类型[s]

我认为他们(其开发人员)将其添加到下一个版本会更好

【讨论】:

    猜你喜欢
    • 2015-01-11
    • 2021-06-05
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多