【问题标题】:Genson deserialize a list of given typesGenson 反序列化给定类型的列表
【发布时间】:2021-10-27 09:43:03
【问题描述】:

我正在编写一个帮助函数。 getList 将从某处获取序列化数据,并将其反序列化。

getList 总是返回一个列表。用户将指定元素的类型。预期的用法是这样的:

List<Asset> l1 = getList("Asset"); //warning Unchecked assignment is fine
List<Store> l2 = getList("Store");
//or 
List<Asset> l1 = getList(Asset.class);
List<Store> l2 = getList(Store.class);
//or 
List<Asset> l1 = getList<Asset>();
List<Store> l2 = getList<Store>();

我将如何修复以下实现?它无法编译,因为 className 是一个变量,而 List 需要一个类。

public static List getList(String className)
{
    Genson genson = new Genson();
    String data = ...
    List l= genson.deserialize(data, List<className>);
                                     ~~~~~~~~~~~~~~~
    return l;
}

【问题讨论】:

  • Genson 似乎是一个较少使用的库,因此我怀疑你会在这里找到很多帮助。只是通过List.class 怎么样?如果您需要有关元素类型的更多信息(即使用 className,您可能需要传递其他内容(Jackson 为 TypeRef 对此,不知道 Genson 有什么)。
  • genson.io/GettingStarted 上有一个geson 的入门指南。这有以下泛型类型的示例:List&lt;Person&gt; persons = genson.deserialize(json, new GenericType&lt;List&lt;Person&gt;&gt;(){});
  • @Jack 我如何让Person 成为调用者可以传入的变量?

标签: java genson


【解决方案1】:

http://genson.io/GettingStarted 上有一个geson 入门指南。这有以下泛型类型的示例:

List<Person> persons = genson.deserialize(json, new GenericType<List<Person>>(){});

如果要将列表元素的类型传递给方法,可以引入类型参数:

public static <T> List<T> getList(String json, Class<T> clazz) {
    Genson genson = new Genson();
    List<T> list = genson.deserialize(json, new GenericType<List<T>>(){});
    return list;
}

使用该方法的示例如下所示:

public static void main(String[] args) {
    List<String> stringList = getList("[ \"element1\", \"element2\" ]", String.class);
    System.out.println(stringList);

    List<Integer> integerList = getList("[ 1, 2, 3 ]", Integer.class);
    System.out.println(integerList);
}

这将产生以下输出:

[element1, element2]
[1, 2, 3]

【讨论】:

  • 它不起作用。我得到了 HashMap 列表而不是人员列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 2021-04-05
  • 2011-02-17
相关资源
最近更新 更多