首页 > 解决方案 > 运行时 GSON 对象类型转换

问题描述

我有一个模板对象类型 ExternalActionReqBean 有一个可以设置任何类的对象,通过指示动作字段

可以说,如果 action="FROZEN" , ExternalActionReqBean->payload 将是 ExternalActionFrozenReqBean 类类型,如果 action="UNFROZEN" ExternalActionUnFrozenReqBean 类类型将被使用。

如果有效载荷如下所示,实现这一点的最佳实践是什么?

{"txnID":"txn","action":"FROZEN","re​​source":"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;

}

标签: javagson

解决方案


我已经更改了 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,您可以在“反序列化泛型”下找到更多信息


推荐阅读