我在服务器中序列化数据:
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<different classes>
的Map
?
我尝试使用getter和setter创建类,其中包含List
个不同的类而不是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
时完全指定参数化类型;不允许<?>
通配符。
如果您需要执行更强大的操作,例如创建对象种类更多的映射,则需要使用TypeAdapter<T>
创建自定义反序列化程序,该反序列化程序可以教 Gson 如何处理特定类型的对象。
- 这是一个关于如何编写gson类型适配器的教程