java - 运行时 GSON 对象类型转换
问题描述
我有一个模板对象类型 ExternalActionReqBean 有一个可以设置任何类的对象,通过指示动作字段
可以说,如果 action="FROZEN" , ExternalActionReqBean->payload 将是 ExternalActionFrozenReqBean 类类型,如果 action="UNFROZEN" ExternalActionUnFrozenReqBean 类类型将被使用。
如果有效载荷如下所示,实现这一点的最佳实践是什么?
{"txnID":"txn","action":"FROZEN","resource":"PNSENDER","payload":{"msisdn_list":[“xxxx”,”xxx”,”xxx”]}}
ExternalActionReqBean externalActionReqBean = GSON.fromJson(payload, ExternalActionReqBean.class);
if("FROZEN".equals(externalActionReqBean.getAction())){
// externalActionFrozenReqBean = GSON.fromJson(externalActionReqBean.getPayload(),ExternalActionFrozenReqBean.class);
}
@Data
@AllArgsConstructor
public class ExternalActionReqBean {
private String txnID;
private String action;
private String resource;
private Object payload;
}
@Data
public class ExternalActionFrozenReqBean {
private List<String> msisdn_list;
}
@Data
public class ExternalActionUnFrozenReqBean {
private String result;
}
解决方案
我已经更改了 ExternalActionReqBean 类签名,它的类型被转换为 Generic,而不是使用 TypeToken,如下所示。
@Data
@AllArgsConstructor
public class ExternalActionReqBean<T> {
private String txnID;
private String action;
private String resource;
private T payload;
}
代码:
if ("FROZEN".equals(externalActionReqBean.getAction())) {
Type complexType = new TypeToken<ExternalActionReqBean<ExternalActionFrozenReqBean>>() {}.getType();
ExternalActionReqBean<ExternalActionFrozenReqBean> result = GSON.fromJson(payload, complexType);
}
感谢https://futurestud.io/tutorials/gson-advanced-generics,您可以在“反序列化泛型”下找到更多信息
推荐阅读
- r - R函数从不完整的数据框中提取井值的成对组合?
- google-workspace - 用户在 Google Workspace 中被清除前的自动提醒
- python - Scrapy:非连续回调的屈服参数
- php - 如何在 PHP 上使用 openssl 使用 SHA256 解密 RSA OAEP
- excel - 如果在 Sub-Ledger 标题下的第三次搜索下面没有值,如何跳过并继续宏
- python - 如何应用依赖于当前数组元素的函数并将结果返回到当前数组元素
- javascript - 将 JavaScript 转换为 Iframe 以在 SharePoint 中使用
- flutter - 如何在使用flutter读取或写入firestore之前获取request.auth.uid
- html - 如何同步实时服务器 html 并直接从文件夹同步?
- c# - Google API .NET 引发 UnauthorizedAccessException