Настраиваемое отображение из JSON в Java / POJO в ответе Spring RestTemplate - PullRequest
1 голос
/ 09 октября 2019

У меня есть загрузочное приложение Spring, где я использую RestTemplate для вызова Rest API, и я получаю следующий отформатированный ответ JSON:

{
  "data": [
    {
      "id": "1",
      "type": "type1",
      "config": {
        "property1" : "value1",
        "property2" : "value2"
      }
    },
    {
      "id": "2",
      "type": "type2",
      "config": {
        "property3" : "value3",
        "property4" : "value4",
        "propArray": [ "element1", "element2"]
      }
    }
  ]
}

Отдельные элементы в массиве 'data' имеют несколько различных структур (2примеры выше), где я хотел бы отобразить различные типы классов с отдельными элементами, которые зависят от значения элемента 'type'.

Например, значение 'type1' должно отображаться на объект типа Class 'Type1'и т. д.

У меня есть классы, созданные следующим образом: MyResponse:

public Class MyResponse {
  List<Data> data;
..
  \\getter and setters
}

Данные:

public Interface Data {}

Тип 1:

public Class Type1 implements Data {
  private String property1;

  private String property2;
..
  \\getter and setters
}

Тип2:

public Class Type1 implements Data {
  private String property3;

  private String property4;

  private List<String> propArray;
..
  \\getter and setters
}

Как я могу отобразить выше условной структуры?

1 Ответ

2 голосов
/ 09 октября 2019

Единственный способ, которым я мог думать об этом, - это получить возвращаемое значение String, преобразовать его в JSONObject и обработать для создания ваших экземпляров ваших классов. Например,

    String response = restTemplate.<your-uri>
    JSONObject jsonObject = new JSONObject(response);
    if (jsonObject.get(type).equals(type1) {
        Type1 type1 = new Type1();
        // set values
    } else if (jsonObject.get(type).equals(type2) {
        Type2 type2 = new Type2()
        // set values
    }

Однако это не масштабируется, и если вы собираетесь добавлять все больше и больше типов, будет очень сложно поддерживать чистый код.

Другой способ сделать этоэто для создания общего класса и получения ответа в виде списка этого класса. Таким образом Spring-boot / Jackson Cand делают отображение. Снова вы должны добавить код для создания других классов из этого общего класса. Как отметил Сэм в комментарии, этот вариант предпочтительнее, поскольку Джексон работает быстрее, чем JSONObject. Вот пример класса будет выглядеть так:

class Response {
    private Integer id;
    private String type;
    private Map<String, Object> config;
}

Вы все еще должны проверить тип и сопоставить с соответствующим классом.

Вместо написания такого грязного кода, я бы подумал, смогу ли я перестроить ваш дизайн / отправленный ответ, если у вас есть контроль над ним.

...