jackson @JsonGetter 和 @JsonSetter 如何工作

Tom*_*Tom 1 java jackson jackson2 jackson-databind

我正在使用 jackson 2.10.0 ( https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core/2.10.0 ),以下是一个简单的测试用例

Person类定义如下,对于setter,我使用了@JsonSetter注解,而没有使用@JsonGetter作为getter,

import com.fasterxml.jackson.annotation.JsonProperty;

public class Person {
    private String firstName;
    private String lastName;

    public String getFirstName() {
        return firstName;
    }

    @JsonSetter("first_name")
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    @JsonSetter("last_name")
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

}
Run Code Online (Sandbox Code Playgroud)

然后,我创建一个 Person 对象,并将其序列化为字符串,

import com.fasterxml.jackson.databind.ObjectMapper;


public class Person3Test2 {
    public static void main(String[] args) throws Exception {
        Person p = new Person();
        p.setFirstName("abc");
        p.setLastName("def");
        String str = new ObjectMapper().writeValueAsString(p);
        System.out.println(str);
    }
}
Run Code Online (Sandbox Code Playgroud)

它会调用 Person 的 getter,因为它不使用 @JsonGetter,所以我认为输出应该是

{"firstName":"abc","lastName":"def"}
Run Code Online (Sandbox Code Playgroud)

但是,我惊讶地发现它是:

{"first_name":"abc","last_name":"def"}
Run Code Online (Sandbox Code Playgroud)

看起来@JsonSetter 影响了getter 输出,我想问一下这里的行为是什么。

Dea*_*ool 5

@JsonSetter在序列化期间也会影响这里是github问题,如果您想要不同的名称,只需@JsonGetterget方法上使用另一个注释

文档可能有误;@JsonSetter 不仅影响反序列化。虽然它确实可以用于非对称命名(类似于带有“拆分”注释的@JsonProperty 本身),但它的范围不受限制。它可能在某个时候出现过,但是在统一属性处理之后(在 1.8 左右),各种属性访问器之间的分离较少。

我可以查看 Javadocs 以明确没有任何注释在范围上受到严格限制——有些可能只与一个或另一个相关,但没有一个是有意分开的。