Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对于Spring,除了使用setter和@JsonProperty进行反序列化之外,还有其他方法吗_Java_Spring_Spring Boot_Deserialization - Fatal编程技术网

Java 对于Spring,除了使用setter和@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

仅使用两个非常基本的示例。。除了将JSON反序列化到POJO,我不需要创建setter,也不需要在每个字段上声明@JsonProperty,还有其他方法吗

@JsonProperty似乎冗长且重复
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,如果您没有用注释标记属性,包将不知道应该序列化还是反序列化哪个。因此,没有其他go

Jackson具有自动检测功能,默认情况下,该功能将只反序列化所有公共字段和所有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文件中