代码之家  ›  专栏  ›  技术社区  ›  Ahmet Karakaya

运行时gson对象类型转换

  •  0
  • Ahmet Karakaya  · 技术社区  · 7 年前

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

    例如,如果action=“frozen”,ExternalActionReqBean->Payload将ExternalActionFrozenReqBean类类型, 如果action=“unfrozen”ExternalActionUnfrozenReqBean类类型将被使用。

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

    “txnid”:“txn”,“action”:“frozed”,“resource”:“pnsender”,“payload”:“msisdn_list_157;:[__XXXX_,__,_ 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;
    
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Ahmet Karakaya    7 年前

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