При сериализации объектов Java в JSON и десериализации JSON в объекты Java иногда требуется игнорировать свойство только во время сериализации, но разрешить десериализацию свойства в свойство объекта Java. В аналогичном примечании может быть требование, согласно которому свойство должно игнорироваться только при десериализации в свойство объекта java, но свойство должно быть разрешено для сериализации.

Предположим, у нас есть серверная служба в приложении, в котором хранятся сведения о клиенте приложения, такие как имя, телефон, пароль и т. д. Предположим, что структура объекта «Клиент» приведена ниже.

public class Customer {
    private String name;
    private String customerTelephone;
    private String password;
    private String welcomeMessage;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCustomerTelephone() {
        return customerTelephone;
    }

    public void setCustomerTelephone(String customerTelephone) {
        this.customerTelephone = customerTelephone;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getWelcomeMessage() {
        return welcomeMessage;
    }

    public void setWelcomeMessage(String welcomeMessage) {
        this.welcomeMessage = welcomeMessage;
    }

}

Предположим, что есть конечная точка API для отдыха, приложение, которое извлекает данные, связанные с клиентом, из базы данных. При отправке данных клиента в ответ потребителю API мы хотели бы сериализовать (отправить) все данные клиента, кроме конфиденциальной информации, такой как пароль. Но поле пароля должно иметь возможность десериализоваться в поле объекта java для конечной точки API для отдыха. что позволяет обновить поле пароля клиента.

Это поле пароля должно быть разрешено только для десериализации, но не должно быть разрешено для сериализации.

Представьте, что остальная конечная точка API для получения сведений о клиенте имеет приветственное сообщение для клиента. Это приветственное сообщение, отправляемое в ответ на вызов API, должно быть разрешено только для сериализации, но не для десериализации в объект Java.

Ниже приведены остальные конечные точки для службы сведений о клиенте.

@RestController
public class CustomerController {

    @GetMapping("/customerdetail/{name}")
    public Customer getCustomerDetail(@PathVariable("name")String customerName){
        Customer customer = new Customer();
        customer.setName(customerName);
        customer.setCustomerTelephone("1234");
        customer.setPassword("password_to_be_ignored_while_serialization");
        customer.setWelcomeMessage("Welcome to my world "+customerName);
        return customer;
    }

    @PostMapping("/customerdetail/update")
    public Customer updateCustomerDetail(@RequestBody Customer customer){
        System.out.println("Customer Name:"+customer.getName());
        System.out.println("Customer Telephone:"+customer.getCustomerTelephone());
        System.out.println("Password:"+customer.getPassword());
        System.out.println("Welcome message:"+customer.getWelcomeMessage());
        return customer;
    }

Это требование разрешения свойства только во время сериализации/десериализации может быть выполнено с помощью параметра @JsonProperty аннотации Джексона для доступа.

Если мы добавим аннотацию с соответствующим значением для доступа. мы можем добиться только выборочной сериализации/десериализации, но не можем быть десериализованы/сериализованы соответственно.

public class Customer {
    private String name;
    private String customerTelephone;
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password;
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private String welcomeMessage;
public String getName() {
        return name;
    }
public void setName(String name) {
        this.name = name;
    }
public String getCustomerTelephone() {
        return customerTelephone;
    }
public void setCustomerTelephone(String customerTelephone) {
        this.customerTelephone = customerTelephone;
    }
public String getPassword() {
        return password;
    }
public void setPassword(String password) {
        this.password = password;
    }
public String getWelcomeMessage() {
        return welcomeMessage;
    }
public void setWelcomeMessage(String welcomeMessage) {
        this.welcomeMessage = welcomeMessage;
    }
}

@JsonProperty(доступ = JsonProperty.Access.WRITE_ONLY)

Аннотирование переменной пароля указанным выше позволит только десериализовать поле, но игнорировать его при сериализации.

@JsonProperty(access = JsonProperty.Access.READ_ONLY)

Аннотирование переменной приветственного сообщения приведенным выше позволит только сериализовать поле, но игнорировать его при десериализации.

Давайте попробуем использовать остальную конечную точку API и посмотрим на результат.

Поле приветственного сообщения игнорируется во время десериализации в объект Java, но все другие поля, такие как пароль и т. д., десериализуются в объект Java.

Использование оставшейся конечной точки для получения сведений о клиенте

Как видно из ответа API, поле пароля игнорируется для сериализации, тогда как все остальные поля, такие как приветственное сообщение, были успешно сериализованы.

Таким образом, мы добились того, что поле приветственного сообщения разрешено только для сериализации и игнорируется при десериализации. и поле пароля разрешено только при десериализации и игнорируется при сериализации.

Пожалуйста, посетите мой канал YouTube https://youtube.com/channel/UC-8tqCyhtt6Lt5-n2UMZB_A