nuclear_kote
@nuclear_kote

Как запретить десериализацию поля в jackson?

@Data
public class TestObject {

    private String name;
    @JsonRawValue
    private String result;

}

@RestController
@RequestMapping("test")
public class TestController {

    @GetMapping
    public String get() {
        return "{" +
                "\"name\": \"vasya\"," +
                "\"result\": {\"bla\": \"bla\"}" +
                "}";
    }
}


    public static void main(String[] args) {
        RestTemplate template = new RestTemplate();
        ResponseEntity<TestObject> exchange = template.exchange("http://localhost:8080/test", HttpMethod.GET, null, TestObject.class);

        System.out.println(exchange.getBody());
    }
}


нужно , чтобы в поле result попадал json как строка. Менять ответ контроллера (например обернуть в кавычки) я не могу. нужно это потому что там могут передаваться разные типы данных, а не только json.

а щас вылетает
Exception in thread "main" org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Can not deserialize instance of java.lang.String out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token
  • Вопрос задан
  • 214 просмотров
Решения вопроса 1
nuclear_kote
@nuclear_kote Автор вопроса
так получилось
@Data
public class TestObject {

    private String name;
    @JsonDeserialize(using = ResultDeserializer.class)
    private String result;

    public static class ResultDeserializer extends JsonDeserializer<String>  {

        @Override
        public String deserialize(JsonParser jp, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
            ObjectMapper mapper = (ObjectMapper) jp.getCodec();
            JsonNode node = mapper.readTree(jp);
            return mapper.writeValueAsString(node);
        }
    }

}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
xez
@xez Куратор тега Java
TL Junior Roo
Несовсем понятно, что вам нужно...
@JsonIgnore может быть поможет?...
Ответ написан
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
нужно , чтобы в поле result попадал json как строка. Менять ответ контроллера (например обернуть в кавычки) я не могу.

Можно написать свой кастомный конвертер для контроллера.
https://stackoverflow.com/questions/57536693/how-t...

Или вы имеете ввиду:

аннотацию JsonIgnore?
https://www.tutorialspoint.com/jackson_annotations...
https://stackoverflow.com/questions/12505141/only-...

Есть еще аннотации
https://www.baeldung.com/jackson-bidirectional-rel...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽