Jackson 还需要 getter 方法来使用 @JsonCreator 正确序列化 bean 属性

ric*_*din 4 java json jackson spring-boot spring-restcontroller

我在使用 Spring Boot 1.5 的应用程序中使用 Jackson 将一些 bean 序列化为 JSON。

我注意到要@JsonCreator正确使用 序列化 bean ,我必须为每个属性声明 getter 方法,以及@JsonProperty注释。

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

    @JsonCreator
    public Person(@JsonProperty("name") String name, 
                  @JsonProperty("age") int age) {
       this.name = name;
       this.age = age;
    }

    public String getName() {
        return this.name;
    }
    public int getAge() {
        return this.age;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我删除方法getName并且getAge,Jackson 没有序列化相关的属性。为什么 Jackson 还需要 getter 方法?

Ben*_*ams 5

Jackson 使用反射来访问私有和受保护的属性。一旦您删除了 getter,Jackson 就不知道如何序列化/反序列化属性(=您的私有字段)。@JsonProperty构造函数的使用注释不会帮助 Jackson 在编译时找到属性,因为您的构造函数将在运行时使用。

不直观的是,getter 也使私有字段可反序列化——因为一旦有了 getter,该字段就被认为是一个属性。

Paraschiv, Eugen - “Jackson – 决定哪些字段被序列化/反序列化”