杰克逊@JsonGetter和@JsonSetter如何工作

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

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

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;

    }


}

然后,我创建一个 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);

    }

}

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


{"firstName":"abc","lastName":"def"}

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


{"first_name":"abc","last_name":"def"}

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


缥缈止盈
浏览 146回答 1
1回答

慕容森

@JsonSetter会在序列化期间生效,这也是 github 问题,如果你想要不同的名称,只需@JsonGetter在get方法上使用另一个注释文档可能有误;@JsonSetter 不仅影响反序列化。虽然它确实可以用于非对称命名(类似于 @JsonProperty 本身带有“split”注释),但它的范围不受限制。可能在某个时候是这样,但是在统一属性处理之后(在 1.8 左右),各种属性访问器之间的分离程度减少了。我可以查看 Javadoc 来明确指出,没有任何注释的范围受到严格限制——有些注释可能只与其中之一相关,但没有一个注释是有意分开的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java