Отобразить вложенный JSON в Pojo с необработанным значением JSON - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть вложенное json pojo, где вложенная часть json помечена @JsonRawValue.Я пытаюсь сопоставить его с шаблоном rest, но получаю сообщение об ошибке разбора JSON: Cannot deserialize instance of java.lang.String out of START_OBJECT token;

Вложенное исключение: com.fasterxml.jackson.databind.exc.MismatchedInputException.

. Так выглядит мой объект ответа.например:

import com.fasterxml.jackson.annotation.JsonRawValue;

public class ResponseDTO {

    private String Id;
    private String text;
    @JsonRawValue
    private String explanation;

    //getters and setters;

}

, где explanation - это json, сопоставленный со строкой.Это прекрасно работает с почтальоном, чванством, и я вижу объяснение как json в ответе.

Но когда я тестирую его, используя Rest Template:

    ResponseEntity<ResponseDTO> resonseEntity = restTemplate.exchange(URI, HttpMethod.POST, requestEntity, ResponseDTO.class);

Я вижу это исключение:

org.springframework.web.client.RestClientException: Error while extracting 
response for type [class com.**.ResponseDTO] and content type 
[application/json;charset=utf-8]; nested exception is 
org.springframework.http.converter.HttpMessageNotReadableException: JSON 
parse error: Cannot deserialize instance of java.lang.String out of 
START_OBJECT token; nested exception is 
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot 
deserialize instance of java.lang.String out of START_OBJECT token
     at [Source: (PushbackInputStream); line: 1, column: 604] (through 
reference chain: com.****.ResponseDTO["explanation"])

1 Ответ

0 голосов
/ 04 февраля 2019

Джексон говорит вам, что он не может вставить объект (в журнал ошибок) в строку.

@JsonRawValue используется во время сериализации объектов в формат JSON.Это способ указать, что поле String должно быть отправлено как есть.Другими словами, цель состоит в том, чтобы сообщить Джексону, что строка является допустимым JSON и должна отправляться без экранирования или цитирования.

Вместо этого вы можете предоставить Джексону собственный метод для установки полязначение.Использование JsonNode в качестве аргумента заставит Джексона передать «необработанное» значение.Оттуда вы можете получить строковое представление:

public class ResponseDTO {

    private String Id;
    private String text;
    private String explanation;

    //getters and setters;

    @JsonProperty("explanation")
    private void unpackExplanation(JsonNode explanation) {
        this.explanation = explanation.toString();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...