除了使用Spring的setter和@JsonProperty反序列化之外,还有其他方法吗?

时间:2019-06-04 16:38:31

标签: java spring spring-boot deserialization

仅使用两个非常基本的示例..除了将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 个答案:

答案 0 :(得分:2)

Jackson具有自动检测功能,默认情况下将仅反序列化所有 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);

答案 1 :(得分:0)

另一种方法是创建一个Builder,其中only annotations that Jackson needs@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注释每个字段一样乏味,但是就不变性而言,它比设置方法要好。

答案 2 :(得分:0)

对于Getter / Setter尝试使用Lombok,可以参考此https://www.baeldung.com/intro-to-project-lombok

Lombok的主要目标是减少样板代码,这非常有用。

关于@JsonProperty,如果您不使用批注标记属性,则程序包将不知道应该序列化或反序列化哪个。因此没有其他选择