Jackson: как запретить сериализацию поля password

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для того чтобы исключить поле из сериализации с использованием Jackson, примените аннотацию @JsonIgnore. Если же необходимо исключить больше одного поля в классе, воспользуйтесь аннотацией @JsonIgnoreProperties, указав в её параметрах имена полей.

Пример с @JsonIgnore:

Java
Скопировать код
class Example {
    String included;
    
    @JsonIgnore // это поле не будет участвовать в сериализации
    String excluded;
}

Для управления сериализацией нескольких полей или для применения внешней конфигурации используйте mixin с @JsonIgnoreProperties:

Java
Скопировать код
@JsonIgnoreProperties({"excluded1", "excluded2"})
abstract class ExampleMixin {}

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixIn(Example.class, ExampleMixin.class);

Особые случаи: защищаем чуткую информацию

В случаях, когда речь идет о конфиденциальной информации, такой как пароли, важно обеспечить ее безопасность. Аннотации Jackson позволят вам с этим справиться.

@JsonIgnore и @JsonProperty: неразлучные партнеры

Если вам нужно принимать данные, но не отображать их при сериализации (например, при обновлении пароля клиентом), примените @JsonIgnore для геттера и @JsonProperty для сеттера:

Java
Скопировать код
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, который позволяет скрыть поле при сериализации, однако десериализация останется доступной:

Java
Скопировать код
public class User {
    
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) // поле будет доступно только для записи
    private String password;
}

Визуализация

Представьте класс как набор инструментов. Цель — при помощи @JsonIgnore скрыть один из этих инструментов:

Java
Скопировать код
class Toolbox {
    public Tool hammer;    // молоток
    public Tool wrench;    // гаечный ключ
    @JsonIgnore           // топор будет скрыт при сериализации
    public Tool axe;      
    public Tool saw;       // пила
}

Когда Jackson проводит сериализацию, топор исчезает из результата:

Markdown
Скопировать код
До сериализации: [🔨, 🔧, 🪓, 🪚]
После сериализации:  [🔨, 🔧, 🪚]

Таким образом, топор был исключен из сериализованного представления.

Продвинутые способы: не только трюки с картами

Зашифрованные поля: в роли "Энигмы"

Для хранения зашифрованных данных примените @JsonProperty, чтобы определить пользовательский геттер:

Java
Скопировать код
public class SecureData {
    private String secret;

    @JsonProperty // отображает зашифрованное значение
    public String getEncryptedSecret() { 
        return encrypt(secret); // функция шифрования
    }

    private String encrypt(String input) { 
        // ...
        return "encryptedData"; // зашифрованное значение
    }
}

JSON Представления: видимость на ваше усмотрение

Для условного отображения полей можно использовать JSON-представления:

Java
Скопировать код
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 можно контролировать процессы сериализации и десериализации:

Java
Скопировать код
@JsonIgnoreProperties(ignoreUnknown = true)
public class OptimizedClass {
    // поля без аннотаций будут исключены из сериализации.
}

Полезные материалы

  1. Jackson JSON Java Parser API Example Tutorial | DigitalOcean – детальный обзор использования аннотаций Jackson.
  2. java – Only using @JsonIgnore during serialization, but not deserialization – Stack Overflow – обсуждение вопросов по управлению сериализацией на Stack Overflow.
  3. JsonIgnore (Jackson-annotations 2.7.0 API) – официальная документация по аннотации @JsonIgnore от Jackson.
  4. Newest 'jackson' Questions – Stack Overflow – вопросы и обсуждения, связанные с Jackson на Stack Overflow.