反序列化地图<string,list <?=“”>&gt;使用Gson

时间:2015-04-27 08:01:04

标签: java android json gson

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

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.ClassCastExceptioncom.google.gson.internal.LinkedTreeMap无法投放到com.example.model.entity.ProductCategory

如何修复此错误或以Map创建List<different classes>

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

1 个答案:

答案 0 :(得分:2)

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<String, String>
"name" -> "bananas"
"type" -> "go-go"

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

如果你需要做一些更强大的事情,比如在对象中创建更多种类的地图,你需要创建一个自定义反序列化器,使用TypeAdapter<T>,教授Gson如何处理你的特殊对象。