Есть ли альтернатива десериализации с использованием сеттеров и @JsonProperty для Spring - PullRequest
0 голосов
/ 04 июня 2019

Просто используя два очень простых примера. Есть ли альтернатива десериализации JSON для POJO, где мне не нужно создавать сеттеры и где мне не нужно объявлять @JsonProperty для каждого поля?

@ JsonProperty кажется утомительным и повторяющимся
Сеттеры, кажется, ослабляют инкапсуляцию.

Использование сеттеров:

public class Person{
    private int age;
    private String name;

    public int getAge(){
        return age;
    }

    public void setAge(int age){
        this.age = age;
    }

    public String getName(){
        return name;
    }

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

Использование @JsonProperty:

public class Person{
    @JsonProperty private int age;
    @JsonProperty private String name;

    public int getAge(){
        return age;
    }

    public String getName(){
        return name;
    }
}

Ответы [ 3 ]

2 голосов
/ 04 июня 2019

Джексон имеет функцию автоопределения, которая по умолчанию десериализует только все поля public и все сеттеры.Вот почему, если все поля являются закрытыми, ничто не будет десериализовано, если нет установщиков.

Вы можете использовать @JsonAutoDetect для настройки этой функции автоопределения так, что она будет десериализовать даже полячастный.Таким образом, вам больше не нужно добавлять какие-либо сеттеры.

Чтобы настроить для каждого объекта:

@JsonAutoDetect(fieldVisibility = Visibility.ANY)
public class Person{
    private int age;
    private String name;
}

Чтобы настроить глобально, так что вам не нужно настраивать для каждогообъект:

ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
0 голосов
/ 04 июня 2019

Для Getter / Setter попробуйте использовать Lombok, можно отослать это https://www.baeldung.com/intro-to-project-lombok.

Основная цель Lombok - уменьшить код котельной плиты, и это очень полезно.

И что касается @JsonProperty, если вы не пометите атрибут аннотацией, пакет не будет знать, какой он должен быть сериализатором или десериализованным.

0 голосов
/ 04 июня 2019

Альтернативой является создание Builder, в котором только аннотации, которые нужны Джексону , равны @JsonDeserialize и @JsonPOJOBuilder, например:

@JsonDeserialize(builder = Person.Builder.class)
public class Person {
  ...
  @JsonPOJOBuilder(buildMethodName = "build", withPrefix = "")
  public static class Builder {
    ...
    public Builder age(final int age) {
      this.age = age;
      return this;
    }
    ...
  }
}

Я считаю, что это так же утомительно, как аннотировать каждое поле с помощью @JsonProperty, но с точки зрения неизменности оно лучше, чем сеттеры.

...