Jackson: как запретить сериализацию поля password
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для того чтобы исключить поле из сериализации с использованием Jackson, примените аннотацию @JsonIgnore
. Если же необходимо исключить больше одного поля в классе, воспользуйтесь аннотацией @JsonIgnoreProperties
, указав в её параметрах имена полей.
Пример с @JsonIgnore
:
class Example {
String included;
@JsonIgnore // это поле не будет участвовать в сериализации
String excluded;
}
Для управления сериализацией нескольких полей или для применения внешней конфигурации используйте mixin с @JsonIgnoreProperties
:
@JsonIgnoreProperties({"excluded1", "excluded2"})
abstract class ExampleMixin {}
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixIn(Example.class, ExampleMixin.class);
Особые случаи: защищаем чуткую информацию
В случаях, когда речь идет о конфиденциальной информации, такой как пароли, важно обеспечить ее безопасность. Аннотации Jackson позволят вам с этим справиться.
@JsonIgnore и @JsonProperty: неразлучные партнеры
Если вам нужно принимать данные, но не отображать их при сериализации (например, при обновлении пароля клиентом), примените @JsonIgnore
для геттера и @JsonProperty
для сеттера:
public class User {
private String password;
@JsonIgnore // пароль не будет отображаться в ответах
public String getPassword() { return password; }
@JsonProperty // позволяет устанавливать пароль
public void setPassword(String password) { this.password = password; }
}
JsonProperty.Access.WRITE_ONLY: зона особого внимания
С версии Jackson 2.6 стал доступен параметр JsonProperty.Access.WRITE_ONLY
, который позволяет скрыть поле при сериализации, однако десериализация останется доступной:
public class User {
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY) // поле будет доступно только для записи
private String password;
}
Визуализация
Представьте класс как набор инструментов. Цель — при помощи @JsonIgnore
скрыть один из этих инструментов:
class Toolbox {
public Tool hammer; // молоток
public Tool wrench; // гаечный ключ
@JsonIgnore // топор будет скрыт при сериализации
public Tool axe;
public Tool saw; // пила
}
Когда Jackson проводит сериализацию, топор исчезает из результата:
До сериализации: [🔨, 🔧, 🪓, 🪚]
После сериализации: [🔨, 🔧, 🪚]
Таким образом, топор был исключен из сериализованного представления.
Продвинутые способы: не только трюки с картами
Зашифрованные поля: в роли "Энигмы"
Для хранения зашифрованных данных примените @JsonProperty
, чтобы определить пользовательский геттер:
public class SecureData {
private String secret;
@JsonProperty // отображает зашифрованное значение
public String getEncryptedSecret() {
return encrypt(secret); // функция шифрования
}
private String encrypt(String input) {
// ...
return "encryptedData"; // зашифрованное значение
}
}
JSON Представления: видимость на ваше усмотрение
Для условного отображения полей можно использовать JSON-представления:
public class Viewable {
interface Summary { }
static class Detailed extends Summary { }
@JsonView(Summary.class) // для общей информации
public String getGeneralInfo() { return "general"; }
@JsonView(Detailed.class) // для детальной информации
public String getDetailedInfo() { return "detailed"; }
}
// при сериализации указываем конкретное представление
ObjectWriter writer = mapper.writerWithView(Viewable.Summary.class);
@JsonIgnoreProperties
: главное — это прозрачность
При использовании @JsonIgnoreProperties
можно контролировать процессы сериализации и десериализации:
@JsonIgnoreProperties(ignoreUnknown = true)
public class OptimizedClass {
// поля без аннотаций будут исключены из сериализации.
}
Полезные материалы
- Jackson JSON Java Parser API Example Tutorial | DigitalOcean – детальный обзор использования аннотаций Jackson.
- java – Only using @JsonIgnore during serialization, but not deserialization – Stack Overflow – обсуждение вопросов по управлению сериализацией на Stack Overflow.
- JsonIgnore (Jackson-annotations 2.7.0 API) – официальная документация по аннотации
@JsonIgnore
от Jackson. - Newest 'jackson' Questions – Stack Overflow – вопросы и обсуждения, связанные с Jackson на Stack Overflow.