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

Posted

技术标签:

【中文标题】Jackson 还需要 getter 方法来使用 @JsonCreator 正确序列化 bean 属性【英文标题】:Jackson also needs getter methods to correctly serialize a bean property using @JsonCreator 【发布时间】:2018-09-22 20:33:01 【问题描述】:

我在使用 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;
    

如果我删除方法 getNamegetAge, Jackson 不会序列化相关的属性。为什么 Jackson 还需要 getter 方法?

【问题讨论】:

【参考方案1】:

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

不直观的是,getter 还使私有字段也可反序列化 - 因为一旦它具有 getter,该字段就被视为属性。

Paraschiv, Eugen - "Jackson – Decide What Fields Get Serialized/Deserialized"

【讨论】:

以上是关于Jackson 还需要 getter 方法来使用 @JsonCreator 正确序列化 bean 属性的主要内容,如果未能解决你的问题,请参考以下文章

Jackson库的优点及使用

如何在 Jackson 中为特定类配置 setter 和 getter 名称约定?

json之jackson序列化反序列化探究(二)

Jackson 啥时候需要无参数构造函数进行反序列化?

Jackson工具使用

IDE 不显示 Lombok 为 Jackson 注释类生成的 getter 和 setter