仅使用两个非常基本的示例..除了将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;
}
}
答案 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,如果您不使用批注标记属性,则程序包将不知道应该序列化或反序列化哪个。因此没有其他选择