簡體   English   中英

反序列化地圖 <String, List<?> &gt;使用Gson

[英]Deserialize Map<String, List<?>> using 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.ProductCategorycom.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如何處理你特定類型的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM