Преобразование типов объектов GSON во время выполнения - PullRequest
0 голосов
/ 22 октября 2018

У меня есть тип объекта шаблона ExternalActionReqBean, имеющий объект, который может быть установлен любым классом, посредством указания полей действия

Допустим, если action = "FROZEN", полезная нагрузка ExternalActionReqBean-> будет иметь тип класса 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;

}

1 Ответ

0 голосов
/ 22 октября 2018

Я изменил подпись класса 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, вы можете найти больше в разделе "Десериализация дженериков"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...