我在服务器中序列化数据:
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
如何修复此错误或以Map
创建List<different classes>
?
我尝试使用getter和setter创建类,其中包含List
个不同的类而不是Map<String, List<?>>
,并将其用于序列化和反序列化。但我正在寻找更好的方法。
答案 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所做的是,它会创建一个看起来像
的Map<String, String>
"name" -> "bananas"
"type" -> "go-go"
如果你想做一些不同的事情,最简单的要做的事情 - 但也是最不强大的 - 是在你创建TypeToken
时完全指定参数化类型;不允许使用通配符<?>
。
如果你需要做一些更强大的事情,比如在对象中创建更多种类的地图,你需要创建一个自定义反序列化器,使用TypeAdapter<T>
,教授Gson如何处理你的特殊对象。