Gson:解析通用集合

发布于 2025-01-05 08:06:12 字数 505 浏览 0 评论 0 原文

是否可以创建一个从 jsson 解析通用集合的方法?我上面的方法不起作用,因为在运行时 gson 在此处返回 LinkedHasmaps 的 ArrayList,但是在编译时没有错误。

private <T> ArrayList<T> readArray(String json)
{
    Gson gson = new Gson();
    Type collType = new TypeToken<ArrayList<T>>() {
    }.getType();
    return gson.fromJson(json, collType);
}

我已经在这里看过一些类似的问题,例如: Using a generic type with Gson,但我没有找到真正有效的解决方案。

Is it possible to create a method, that parses a generic collection from jsson? My aproach above doesn't work, because at runtime gson returns an ArrayList of LinkedHasmaps here, however there is no errors at compile time.

private <T> ArrayList<T> readArray(String json)
{
    Gson gson = new Gson();
    Type collType = new TypeToken<ArrayList<T>>() {
    }.getType();
    return gson.fromJson(json, collType);
}

I have already looked at some similar questions here like: Using a generic type with Gson, but I found no solution, that really works.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

木有鱼丸 2025-01-12 08:06:12

TypeToken 的东西要求你在编译时固定类型参数。就像 ArrayList 之类的。 ArrayList 将不起作用。

如果您可以在运行时以某种方式获取 T 的类对象,那么您可以尝试我在 如何构建 Java 类型中建议的解决方案运行时的对象来自泛型类型定义和运行时类型参数?

The TypeToken stuff requires you to have the type parameters fixed at compile time. Like ArrayList<String> or something. ArrayList<T> will not work.

If you can get the class object for T passed in somehow at runtime, then you can try the solution I suggested in How do I build a Java type object at runtime from a generic type definition and runtime type parameters?

梦断已成空 2025-01-12 08:06:12

它似乎比大多数人想象的要简单:

Type collectionType = new TypeToken<ArrayList<Person>>(){}.getType();
ArrayList<Person> persons = gson.fromJson(response, collectionType);

不需要像 newacct 在他的答案中建议的那样复制 ParameterizedTypeImpl 类。

It appeared to be really simpler than most people thought:

Type collectionType = new TypeToken<ArrayList<Person>>(){}.getType();
ArrayList<Person> persons = gson.fromJson(response, collectionType);

No need to copy ParameterizedTypeImpl class as newacct suggested in his answer.

人生戏 2025-01-12 08:06:12

默认情况下,在 v2.1 中,如果你不做任何操作,就会反序列化一个 List>

你可以为该 Collection 类型注册一个 TypeAdapterFactory,然后确定实际上应该反序列化到什么样的对象。

By default, in v2.1, if you don't do anything, it will be deserialized a List<Map<String,Object>>

You can register a TypeAdapterFactory for that Collection type and then determine to what kind of objects this should be actually deserialized.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文