Spring RestTemplate Сопоставьте конкретное значение ключа внутри ответа JSON на класс POJO

У меня есть API, который возвращает JSON в этом формате:

 {
      "errors": null,
      "someKey1": "someValue1",
      "someKey2": "someValue2",
      "response": {
          "id": 21,
          "key1": "value1",
          "key2": "value2",
          "key3": "value3",
          "key4": {
              "key5": [
                  {
                      "ABC": "abc",
                      "XYZ": 1,
                      "PQR": "pqr"
                  },
                  {
                      "ABC": "abc",
                      "XYZ": 3,
                      "PQR": "pqr"
                  }
              ]
          },
          "key6": "value6"
      }
    }

У меня также есть класс POJO, в котором есть поля, соответствующие ключу response ответа JSON, потому что ключи someKey1, someKey2 и errors не имеют отношения к моему варианту использования.

Можно ли сопоставить ответ JSON с моим классом Java POJO, т.е. сопоставить только значения внутри ключа response?

Один из возможных подходов — принять ответ String и сопоставить его с моим POJO с помощью методов установки.

String apiResponse = restTemplate.exchange(someUrl, HttpMethod.GET, new HttpEntity<>(authHeader), String.class).getBody();
JSONObject jsonObject = new JSONObject(apiResponse);
MyObject myObject = buildNewObject(jsonObject.get("response"));

Есть ли способ лучше. Что-то вроде этого ? :

ResponseEntity<MyObject> responseEntity = restTemplate.exchange(someUrl, HttpMethod.GET, new HttpEntity<>(authHeader), MyObject.class).getBody().get("response");

person coder_r    schedule 24.11.2017    source источник
comment
Мне пришлось сделать MyObject как класс-оболочку, который имеет класс Response в качестве ключа, а затем получить от него Response, что сработало.   -  person coder_r    schedule 25.11.2017


Ответы (2)


Вы можете создать класс Mapper с вашим POJO в качестве одного объекта и другими дополнительными значениями в качестве переменных, как показано ниже.

class Mapper{

private PojoClass response;
private String someKey1;
private String somekey2;
private String errors;

//Create getters and setters

}

Теперь response будет автоматически привязываться к POJO, а другие значения будут привязаны к соответствующему ключу 1, ключу 2 и ошибкам.

person vipin cp    schedule 25.11.2017

Вы можете использовать getForObject из RestTemplate.

Пример кода:

HttpClient client = new HttpClient();
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials("USERNAME","PASS");
RestTemplate template = new RestTemplate(commons);
MyObject myObject = template.getForObject(someUrl,MyObject.class);

public class MyObject  {
    @JsonProperty(value="response")
    private Map<String,String> response;
}
person Yogi    schedule 24.11.2017