You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 18:27:33