我在服务器中序列化数据:
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) {
}
我得到错误:
Caused by:
java.lang.ClassCastException
:com.google.gson.internal.LinkedTreeMap
cannot be cast tocom.example.model.entity.ProductCategory
如何修复此错误或以其他方式创建 Map
与 List<different classes>
?
我已经尝试使用 getter 和 setter 创建类,其中包含 List
不同类别的 s 而不是 Map<String, List<?>>
并将其用于序列化和反序列化。但我正在寻找更好的方法。
最佳答案
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
时完全指定参数化类型;无通配符 <?>
允许。
如果您需要做一些更强大的事情,比如创建具有更多对象的 map ,您需要创建一个自定义反序列化器,使用 TypeAdapter<T>
,它教会 Gson 如何处理特定类型的对象。
关于java - 使用 Gson 反序列化 Map<String, List<?>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29890239/