I serialize data in server:
Gson gson = new Gson();
Map<String, List<?>> resultMap = BackendUpdateManager.getInstance()
    .getUpdates(timeHolder, shopIdInt, buyerIdInt);
gson.toJson(resultMap);
and deserialize:
Gson gson = new Gson();
Map<String, List<?>> resultMap =  gson.fromJson(json,
    new TypeToken<Map<String, List<?>>>() {
    }.getType());
However, when I try use items from the Map:
List<ProductCategory> productCategoryList = (List<ProductCategory>)updateMap.get(key);
for(ProductCategory productCategory : productCategoryList) {
}
I get error:
Caused by:
java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMapcannot be cast tocom.example.model.entity.ProductCategory
How can I fix this error or otherwise create a  Map with List<different classes>?
I've tried creating classes with getters and setters, that contains Lists of different classes instead of Map<String, List<?>> and use it for serialization and deserialization. But I'm looking for a better way.
How is Gson supposed to know that a particular Json string is a ProductCategory? For instance, if the definition of ProductCategory is this:
package com.stackoverflow.vitvetal;  
public class ProductCategory {
    String name;
    String type;
}
And the Json is this:
{
    "name":"bananas",
    "type":"go-go"
}
Where is the link that tells Gson to create an instance of a com.stackoverflow.vitvetal.ProductCategory?
So what gson does instead is, it creates a Map<String, String> that looks like
"name" -> "bananas"
"type" -> "go-go"
If you want to do something different, the easiest thing to do - but also the least powerful - is to fully specify the parameterized type when you create your TypeToken; no wildcard <?> allowed.
If you need to do something more powerful, like creating maps with more variety in objects, you need to create a custom deserializer, using a TypeAdapter<T>, that teaches Gson how to handle your particular sort of object.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With