使用Gson或Jackson反序列化Card类失败问题求助
问题分析与解决方案
我之前也碰到过类似的问题,其实根源在于这些Google Chat API的模型类(Card、CardHeader)都继承了GenericJson,而GenericJson底层实现了Map<String, Object>接口。Gson和Jackson默认会把实现Map接口的类当成普通Map来反序列化,所以才会把header字段解析成LinkedTreeMap(Gson)或者类似的Map实现,而不是你期望的CardHeader实例。
不用自定义TypeAdapter的话,最稳妥的解决方式是使用Google API Client自带的序列化/反序列化工具,因为这些模型类本来就是为这个工具链设计的,能完美适配。
方法1:用GsonFactory(适配Gson场景)
Google API Client提供了GsonFactory,可以直接用来反序列化你的JSON字符串:
import com.google.api.client.json.gson.GsonFactory; // 初始化GsonFactory(可以复用这个实例) GsonFactory gsonFactory = GsonFactory.getDefaultInstance(); // 反序列化JSON到Card对象 Card card = gsonFactory.fromString(req, Card.class); // 验证结果 CardHeader header = card.getHeader(); System.out.println(header.getTitle()); // 输出HelloWorld,类型正确
方法2:用JacksonFactory(适配Jackson场景)
如果你之前尝试用Jackson遇到同样问题,改用JacksonFactory即可:
import com.google.api.client.json.jackson2.JacksonFactory; JacksonFactory jacksonFactory = JacksonFactory.getDefaultInstance(); Card card = jacksonFactory.fromString(req, Card.class);
为什么原生Gson/Jackson会失败?
因为GenericJson继承的GenericData实现了Map接口,Gson/Jackson的默认序列化逻辑会优先把这类对象当成Map处理,而不是按照POJO的字段映射规则来解析。Google的JsonFactory已经内置了对这类特殊类的处理逻辑,能正确识别@Key注解并映射到对应的实体类。
内容的提问来源于stack exchange,提问作者Srivstvanik
相关产品推荐
相关产品推荐

