【问题标题】:How to specify generic type in this case for GSON在这种情况下如何为 GSON 指定泛型类型
【发布时间】:2017-07-11 07:31:03
【问题描述】:

我有以下代码来说明我的问题:

首先,我定义了 Box 类和 Cat 类

public class Box<T> {
    private T data;

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}
public class Cat {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

然后我定义GsonUtils(静态类),旨在将一些json字符串序列化为Box&lt;T&gt;的对象

public class GsonUtils {

    public static <T> Box<T> json2BoxObject(String json) {
        Type tpe = new TypeToken<Box<T>>(){}.getType();
        return  new GsonBuilder().create().fromJson(json, tpe);
    }

}
  1. 如果我可以为json2BoxObject 方法提供Cat 类型,那么我会得到Box&lt;Cat&gt;
  2. 如果我可以为json2BoxObject 方法提供一个Dog 类型,那么我会得到一个Box&lt;Dog&gt;

但是,我不知道如何为json2BoxObject 提供类型,这是我要问的问题

用上面的代码,给json2BoxObject和json字符串{"data":{"name":"Kitty","age":1}},我想得到一个Box&lt;Cat&gt;对象,但是我得到一个Box[Map]

【问题讨论】:

  • 我不确定我是否得到了你需要的东西,但你可能还需要将类型传递给json2java,所以你的方法看起来像json2Java(String json, Type t) 并使用这个type 参数在.create().fromJson(json, type); [注意:不要再使用tpe]
  • 想要添加,如果您正在创建 GsonUtils 的实例来调用 json2java,那么如果您将类型参数添加到类 GsonUtils &lt;T&gt; 这也可以解决问题,但您是不实例化它,因为 json2java 是静态的,对吧?
  • @Yazan。谢谢你的cmets。对于您的评论#2,我希望 GsonUtil 是静态的,即 json2Java 是一种静态方法,所以我认为 GsonUtils[T] 没有意义。对于您的评论 #1,是的,我可以将类型作为第二个参数传递给 json2Java,类型应该是 Type tpe = new TypeToken&lt;Box&lt;Cat&gt;&gt;() {}.getType(); but 那是我不想定义我的方法..我想限制 json可以反序列化为 Box 的东西,如果我传递类型 Cat,那么我会得到一个 Box
  • 我不明白你的 约束 你仍然会得到 Box 这意味着不仅 Box 如果你的意思是这样,你能解释更多吗?
  • @Yazan。感谢您的评论,我完善了我的问题,希望这能让我的意思清楚

标签: java gson


【解决方案1】:

在某些时候你需要提到猫或狗。我使用 Box 创建了 Type 并将其传递给 json2Java 方法。

String msg ="{\"data\":{\"name\":\"Kitty\",\"age\":1}}";
Type type = new TypeToken<Box<Cat>>(){}.getType();
Box<Cat> obj = GsonUtils.json2Java(msg, type);
System.out.println(obj);

json2Java 方法是:

public static <T> Box<T> json2Java(String json, Type type) {
    Box<T> box = new GsonBuilder().create().fromJson(json, type);
    return box;
}

【讨论】:

  • 感谢@prasath 的帮助。是的,通常,json2Java 应该在您发布时实现,关键是用户提供了Type。我会问是否可以只提供通用类型的 Box,如我的问题所问的 Cat,Dog。看起来这是关于 Java 泛型的更普遍的问题
  • 不提猫或狗,你对猫的期待如何?
  • 谢谢@prasath。这就是我要问的问题,是否有可能以某种方式为 json2Java 方法提供类型信息,例如 Cat 或 Dog...
猜你喜欢
  • 2013-07-22
  • 2020-02-27
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 2017-11-25
相关资源
最近更新 更多