简体   繁体   English

运行时GSON对象类型转换

[英]Runtime GSON object type converting

I have a template object type ExternalActionReqBean having an object that any of the class can be set, by indicationg action fields 我有一个模板对象类型ExternalActionReqBean,该对象具有可以通过指示操作字段设置的任何类的对象

Lets say, if action="FROZEN" , ExternalActionReqBean->payload will ExternalActionFrozenReqBean class type, if action="UNFROZEN" ExternalActionUnFrozenReqBean class type will be used. 可以说,如果action =“ FROZEN”,ExternalActionReqBean-> payload将使用ExternalActionFrozenReqBean类类型,如果使用action =“ UNFROZEN” ExternalActionUnFrozenReqBean类类型。

if payload is like following, what is the best practice to make this happen? 如果有效载荷如下所示,那么实现此目标的最佳实践是什么?

{"txnID":"txn","action":"FROZEN","resource":"PNSENDER","payload":{"msisdn_list”:[“xxxx”,”xxx”,”xxx”]}} { “txnID”: “TXN”, “动作”: “冻结”, “资源”: “PNSENDER”, “有效载荷”:{“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;

}

I have changed the ExternalActionReqBean class signature, its type gets converted to Generic, than use TypeToken as following. 我更改了ExternalActionReqBean类签名,将其类型转换为Generic,然后使用TypeToken如下。

@Data
@AllArgsConstructor
public class ExternalActionReqBean<T> {

   private String txnID;
   private String action;
   private String resource;
   private T payload;

}

Code: 码:

 if ("FROZEN".equals(externalActionReqBean.getAction())) {
  Type complexType = new TypeToken<ExternalActionReqBean<ExternalActionFrozenReqBean>>() {}.getType();
  ExternalActionReqBean<ExternalActionFrozenReqBean> result = GSON.fromJson(payload, complexType);

}

Thanks for https://futurestud.io/tutorials/gson-advanced-generics , you can find more under "Deserialization of Generics" 感谢您的https://futurestud.io/tutorials/gson-advanced-generics ,您可以在“反序列化泛型”下找到更多信息

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM