java - 使用 Gson 反序列化 Map<String, List<?>>

标签 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) {

}

我得到错误:

Caused by: java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.example.model.entity.ProductCategory

如何修复此错误或以其他方式创建 MapList<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/

相关文章:

java - 在 Java 中使用 SAX 事件处理程序,如何在不同事件之间保存变量?

android - ActionBar 中菜单项的动画

javascript - 处理稀疏数组的 JSON 实现

php - cPanel JSON API2 editzone记录问题

尝试生成 json 时出现 Python 键错误

java - 单个应用程序的两个不同数据库框架可以共享相同的连接对象吗?

java - 如何在java中声明这样的数字?

java - 在nimbus-jose-jwt中,生命周期和刷新时间有什么区别?

java - 在 map 上放置多个标记时获取 Latlng 值的无效双 "n\a"

android - 从 com.example 更改 Eclipse Android 项目的默认包