Игнор поля в Java
Не каждое поле объекта нужно отдавать наружу: пароль, внутренний кэш или служебный идентификатор часто остаются только в памяти. Jackson по умолчанию сериализует все видимые свойства, если их явно не отключить.
Аннотацию @JsonIgnore ставят на компонент
record, поле или геттер. При записи в строку такое
свойство пропускают, при чтении ключ в тексте
тоже не требуют:
import com.fasterxml.jackson.annotation.JsonIgnore;
public record UserCard(
String login,
@JsonIgnore String secretToken
) {}
В JSON останется только login. Токен живёт
в объекте после разбора, если его задали в коде,
но в текст не попадает:
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;
public record UserCard(
String login,
@JsonIgnore String secretToken
) {}
public class Main {
public static void main(String[] args) throws Exception {
UserCard card = new UserCard("kim", "tok-99");
ObjectMapper mapper = new ObjectMapper();
String text = mapper.writeValueAsString(card);
System.out.println(text);
UserCard fromText = mapper.readValue(
"{\"login\":\"lee\"}",
UserCard.class
);
System.out.println(fromText.login());
}
}
Для обычного класса с геттерами ту же аннотацию
вешают на метод getSecretToken, чтобы
Jackson не считал свойство частью JSON. Смысл тот
же: наружу уходит только то, что помечено как
данные для обмена.
Опишите record PublicNote с
title и draftComment. Поле
черновика не должно попадать в JSON.
Запишите заметку с заголовком "idea"
и комментарием "wip", выведите JSON
и убедитесь, что ключа черновика в строке нет.
Дана строка JSON:
String raw = "{\"title\":\"done\"}";
Разберите эту строку как
PublicNote с игнорируемым черновиком
и выведите только заголовок.