使用 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

如何修复此错误或以其他方式创建带有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类型适配器的教程

最新更新