【问题标题】:Creating lists of dynamic types创建动态类型列表
【发布时间】:2014-03-20 15:09:54
【问题描述】:

所以,我现在正在努力弄清楚如何解析大量不同的 JSON 对象,而不必对函数进行硬编码来序列化和反序列化每个对象。我开始使用 Gson,效果很好。但是,当我尝试使用对象列表时,问题开始出现。

我想创建一个函数,它可以与我可以传递 JSONArray 和 JSON 包含的类类型的任何数据模型对象一起使用,这样我就会有一个看起来像这样的调用 -

response = JSONHelper.createObjectList(jsonArray, DataObject.class);

顺便说一句,我不是从我的开发机器上发帖的,如果我的代码中有一些拼写错误,请见谅。

我试图通过编写类似这样的内容(在我的 JSONHelper 类中)来创建这种效果 -

public List createObjectList(JSONArray jsonArray, Class type) {
    Gson gson = new Gson();

    Type listType = new TypeToken<List<type>>() {}.getType();

    List<type> data = gson.fromJson(jsonArray, listType);

    return data;
}

好的,很明显这不是工作代码,但这就是我希望能够让它工作的方式。我尝试了几种不同的方法和变体,但我无法找出任何非常好的方法。

我是 Android/Java 世界的新手,所以我仍在学习这门语言的进出。如果有人能给我一些关于如何实现我想要的东西的提示,那将非常有帮助。谢谢。

【问题讨论】:

    标签: java android json list gson


    【解决方案1】:

    答案是:由于类型擦除,您无法在 Java 中执行您想要执行的操作。

    这就是你必须使用TypeToken 并将Type 传递给Gson 的fromJson() 方法的原因T 的类型信息在运行时不可用。 Java 中的泛型大部分只是编译时类型检查。

    理想情况下,您希望能够做到这一点:

    public <T> List<T> createList(JsonArray a, Class<T> clazz)
    {
        Type t = new TypeToken<List<T>>(){}.getType();
        return new Gson().fromJson(a, t);
    }
    

    但你不能,因为 T 被删除了。如果您尝试这样做,您会发现结果完全令人困惑;你得到一个 List 回来,但它不会实际上包含你的类并抛出一个强制转换异常。

    实际上,您的方法必须如下所示:

    public <T> List<T> createList(JsonArray a, Type t)
    {
        List<T> list = new Gson().fromJson(a, t);
        return list;
    }
    

    这当然很愚蠢,因为您现在调用的是您编写的方法,而不仅仅是调用 Gson 中的方法。

    编辑添加:

    考虑一下,List 类型有办法解决这个问题。你可以使用数组:

    public <T> List<T> createList(JsonArray a, Class<T[]> c)
    {
        T[] array = new Gson().fromJson(a, c);
        return Arrays.asList(array);
    }
    

    因为您没有尝试依赖 inside List 中的泛型类型,而是为该类传递了一个数组类型......它可以工作。有点乱,但它有效:

    List<MyPojo> list = createList(a, MyPojo[].class);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 2017-02-23
      • 2011-09-29
      • 2023-03-31
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多