jackson @JsonGetter和@JsonSetter的工作原理

问题描述 投票:1回答:1

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

Person类的定义如下,对于设置方法,我使用了@JsonSetter批注,而对于获取方法没有使用@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似乎已经影响了吸气剂的输出,我想问这是怎么回事。

java jackson jackson-databind jackson2
1个回答
2
投票

[@JsonSetter将在序列化期间生效,并且here是github问题,如果要使用其他名称,请在@JsonGetter方法上使用另一个注释get

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

我可以查看Javadocs来明确指出,没有一个注解在范围上受到严格限制-某些注解可能仅与一个或另一个相关,而没有一个是有意分离的。

© www.soinside.com 2019 - 2024. All rights reserved.