为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

缥缈止盈 2024-01-05 09:55:22
我正在使用 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 输出,我想问这里的行为是什么。
查看完整描述

1 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

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

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

我可以查看 Javadoc 来明确指出,没有任何注释的范围受到严格限制——有些注释可能只与其中之一相关,但没有一个注释是有意分开的。


查看完整回答
反对 回复 2024-01-05
  • 1 回答
  • 0 关注
  • 64 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信