Java 对于Spring,除了使用setter和@JsonProperty进行反序列化之外,还有其他方法吗
仅使用两个非常基本的示例。。除了将JSON反序列化到POJO,我不需要创建setter,也不需要在每个字段上声明@JsonProperty,还有其他方法吗 @JsonProperty似乎冗长且重复Java 对于Spring,除了使用setter和@JsonProperty进行反序列化之外,还有其他方法吗,java,spring,spring-boot,deserialization,Java,Spring,Spring Boot,Deserialization,仅使用两个非常基本的示例。。除了将JSON反序列化到POJO,我不需要创建setter,也不需要在每个字段上声明@JsonProperty,还有其他方法吗 @JsonProperty似乎冗长且重复 setter似乎削弱了封装 使用setter: public class Person{ private int age; private String name; public int getAge(){ return age; } pub
setter似乎削弱了封装 使用setter:
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;
}
}
另一种方法是创建一个生成器,其中包含
@jsondeselliate
和@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注释每个字段一样乏味,但就不变性而言,它比setter好。另一种方法是创建一个生成器,其中are
@jsondeselliate
和@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注释每个字段一样乏味,但就不变性而言,它比Setter好。对于Getter/Setter,请尝试使用Lombok,可以参考此 Lombok的主要目标是减少锅炉板代码,它非常有用
关于@JsonProperty,如果您没有用注释标记属性,那么包将不知道应该序列化还是反序列化哪个属性 Lombok的主要目标是减少锅炉板代码,它非常有用
关于@JsonProperty,如果您没有用注释标记属性,包将不知道应该序列化还是反序列化哪个。因此,没有其他goJackson具有自动检测功能,默认情况下,该功能将只反序列化所有公共字段和所有setter。这就是为什么如果所有字段都是私有的,那么如果没有setter,就不会反序列化任何内容 您可以使用
@JsonAutoDetect
配置此自动检测功能,这样即使字段是私有的,它也会反序列化。这样,您就不需要再添加任何setter了
要配置每个对象,请执行以下操作:
@JsonAutoDetect(fieldVisibility = Visibility.ANY)
public class Person{
private int age;
private String name;
}
要全局配置,以便不需要为每个对象进行配置,请执行以下操作:
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
Jackson具有自动检测功能,默认情况下,该功能仅对所有公共字段和所有设置器进行反序列化。这就是为什么如果所有字段都是私有的,那么如果没有setter,就不会反序列化任何内容 您可以使用
@JsonAutoDetect
配置此自动检测功能,这样即使字段是私有的,它也会反序列化。这样,您就不需要再添加任何setter了
要配置每个对象,请执行以下操作:
@JsonAutoDetect(fieldVisibility = Visibility.ANY)
public class Person{
private int age;
private String name;
}
要全局配置,以便不需要为每个对象进行配置,请执行以下操作:
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
您可以在构造函数上使用
@JsonCreator
,检查这些chrsblck,即使您使用JsonCreator,您也必须使用JsonProperty作为自定义字段名。我问这个问题的主要原因是因为在我的上一份工作中,我创建了POJO,并且它在没有任何注释的情况下自动反序列化。它只需要getter(无论如何我都需要)。我应该问,但没有问,这是如何实现的。@juice,只要json字段名和java类字段名相同,您可以在没有任何jsonProperty的情况下轻松地进行序列化/去序列化。我昨天尝试将JSON反序列化为一个包含两个BigDecimal字段的对象时做到了这一点,除非我有setter或使用@jsonProperty注释,否则它将无法工作。您可以在构造函数上使用@JsonCreator
,检查这些chrsblck,即使您使用了JsonCreator,您必须使用JsonProperty作为自定义字段名。我问这个问题的主要原因是因为在我的上一份工作中,我创建了POJO,并且它在没有任何注释的情况下自动反序列化。它只需要getter(无论如何我都需要)。我应该问,但没有问,这是如何实现的。@juice,只要json字段名和java类字段名相同,您可以在没有任何jsonProperty的情况下轻松地进行序列化/去序列化。我昨天尝试将JSON反序列化为一个包含两个BigDecimal作为字段的对象时做到了这一点,除非我使用setter或@jsonProperty注释,否则它将无法工作。所以我只需要实例化一个ObjectMapper类并调用一个方法?我应该把代码放在哪里?主要方法是什么?是否仍要在application.properties中对此进行配置?我指的是全球解决方案。顺便说一句,这真是太棒了。不管我怎么想。这太棒了。我只是把spring.jackson.visibility.field=ANY
放在application.properties文件中,所以我只需要实例化一个ObjectMapper类并调用一个方法?我应该把代码放在哪里?主要方法是什么?是否仍要在application.properties中对此进行配置?我指的是全球解决方案。顺便说一句,这真是太棒了。不管我怎么想。这太棒了。我只是把spring.jackson.visibility.field=ANY
放在application.properties文件中