Джексон - Десериализация JSON в класс - PullRequest
2 голосов
/ 21 марта 2019

Я вызываю конечную точку, которая возвращает JSON, которая выглядит примерно так (в Postman):

{
    "Result": {
        "attribute1": { ... },
        "attribute2": { ... }
    }
}

Заголовок Content-Type, возвращаемый этим запросом, равен text/x-json (в отличие от обычного application/json). Я думаю, что это вызывает некоторые проблемы при попытке десериализации этого через Джексона. POJO для этого JSON выглядит примерно так:

@Getter
@Setter
public class Response {

    @JsonProperty("Result")
    private Result result;

}

Класс Result из внешней библиотеки (те же самые ребята, которые написали эту конечную точку). В любом случае, когда я пытаюсь вызвать эту конечную точку через RestTemplate.exchange(), Джексон не может десериализовать этот JSON в допустимый класс Result. Я делаю это:

ResponseEntity<Response> response = restTemplate.exchange(url, HttpMethod.GET, null, Response.class);

Выполнение response.getBody() дает объект Response, который содержит нулевой объект Result. Очевидно, Джексон не десериализует JSON должным образом. Я подозреваю, что это из-за необычного text/x-json Content-Type, возвращаемого API.

У меня также есть MappingJackson2HttpMessageConverter объект, настроенный на возможность разбора text/x-json Content-type, но не повезло:

MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
jsonConverter.setSupportedMediaTypes(ImmutableList.of(new MediaType("text", "x-json")));
restTemplate.getMessageConverters().add(jsonConverter);

Есть указатели?

Обновление: я не знаю, почему это не сработало, но я нашел альтернативный способ - выбрать JSON как Map вместо объекта домена, что достаточно для моих целей.

1 Ответ

3 голосов
/ 21 марта 2019

По умолчанию MappingJackson2HttpMessageConverter привязывается к:

  • application / json
  • application / * + json

Нам нужно добавить text/x-json.

MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
List<MediaType> jsonTypes = new ArrayList<>(jsonConverter.getSupportedMediaTypes());
jsonTypes.add(new MediaType("text", "x-json"));
jsonConverter.setSupportedMediaTypes(jsonTypes);

Теперь мы должны использовать его в RestTemplate:

restTemplate.setMessageConverters(Collections.singletonList(jsonConverter));
ResponseEntity<RequestPayload> response = restTemplate.exchange(url, HttpMethod.GET, null, RequestPayload.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...