【问题标题】:Deserialize Map<String, List<?>> using Gson使用 Gson 反序列化 Map<String, List<?>>
【发布时间】:2015-04-27 08:01:04
【问题描述】:

我在服务器中序列化数据:

Gson gson = new Gson();
Map<String, List<?>> resultMap = BackendUpdateManager.getInstance()
    .getUpdates(timeHolder, shopIdInt, buyerIdInt);
gson.toJson(resultMap);

并反序列化:

Gson gson = new Gson();
Map<String, List<?>> resultMap =  gson.fromJson(json,
    new TypeToken<Map<String, List<?>>>() {
    }.getType());

但是,当我尝试使用 Map 中的项目时:

List<ProductCategory> productCategoryList = (List<ProductCategory>)updateMap.get(key);

for(ProductCategory productCategory : productCategoryList) {

}

我得到错误:

由:java.lang.ClassCastException 引起:com.google.gson.internal.LinkedTreeMap 无法转换为 com.example.model.entity.ProductCategory

如何修复此错误或使用List&lt;different classes&gt; 创建Map

我尝试使用 getter 和 setter 创建类,其中包含不同类的 Lists 而不是 Map&lt;String, List&lt;?&gt;&gt;,并将其用于序列化和反序列化。但我正在寻找更好的方法。

【问题讨论】:

  • 如果知道是Map&lt;String, List&lt;ProductCategory&gt;&gt;,为什么还要反序列化为Map&lt;String, List&lt;?&gt;&gt;
  • @azurefrog 不仅是 List。不同key不同类型:updateMap.get(key)
  • 作为错误点:当你反序列化时? GSON 和 JACKSON 使用某种映射来反序列化字符串,您需要自己进行映射。
  • @igreen 当我在反序列化后尝试使用 List> 中的对象时。当反序列化不正确时会发生此错误stackoverflow.com/questions/10356140/…

标签: java android json gson


【解决方案1】:

Gson 应该如何知道特定的 Json 字符串是 ProductCategory?比如ProductCategory的定义是这样的:

package com.stackoverflow.vitvetal;  

public class ProductCategory {
    String name;
    String type;
}

Json 是这样的:

{
    "name":"bananas",
    "type":"go-go"
}

告诉 Gson 创建com.stackoverflow.vitvetal.ProductCategory 实例的链接在哪里?

此链接不存在,因为您没有告诉 Gson。

所以 gson 所做的是,它创建了一个看起来像的 Map&lt;String, String&gt;

"name" -> "bananas"
"type" -> "go-go"

如果你想做一些不同的事情,最简单的事情 - 但也是最不强大的 - 是在创建 TypeToken 时完全指定参数化类型;不允许使用通配符 &lt;?&gt;

如果您需要做一些更强大的事情,例如创建对象种类更多的地图,您需要创建一个自定义反序列化器,使用 TypeAdapter&lt;T&gt;,它会教 Gson 如何处理您的特定对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 2013-12-29
    • 2015-04-28
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多