当前位置: 首页 > 知识库问答 >
问题:

jackson@JsonGetter和@JsonSetter是如何工作的

端木渝
2023-03-14

我使用的是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;
    }

}

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

湛博易
2023-03-14

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

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

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

 类似资料:
  • 问题内容: 我不明白杰克逊的@JsonView( Views.MyClass.class )是什么。我知道我可以用这种方式注释POJO的字段和方法, 以过滤未 注释的字段和方法,以免它们被JSON序列化。但是,什么是Views.Myclass类?它是Jackson库的模板类吗? 为什么在Views类中可以有很多类?例如这样: 为什么需要它,它如何工作? 问题答案: 用于根据序列化的上下文过滤字段。

  • 我试图通过Sonar ut ant JaCoCo runTests示例了解JaCoCo和Sonar是如何协同工作的:https://github.com/SonarSource/sonar-examples/blob/master/projects/code-coverage/ut/ant/ut-ant-jacoco-runTests/build.xml 我在本地机器上安装声纳,默认配置。然后,我

  • 我知道compare and返回一个值。 例如: 方法调用或方法。但是,当compare或返回值时,方法如何排列。在或返回要排序的int值后运行的后台场景是什么?方法如何使用从和返回的int值(或或)

  • 我将用一个例子来问这个问题。假设我有一个这样的项目目录。 首先我想知道我是否把作曲家放在。项目目录中的json文件是否正确,以便在供应商目录中安装库?第二,假设我有以下几行,作曲家。json 那么作曲家将在哪里配置自动加载来查找关于项目根的类samplevendor\包\sampleclass?我问这个问题是在看了symfony2composer.locked文件中的以下几行之后: 更新:我在自动

  • 应用程序具有上下文路径-->/spring-form-simple-project 因此,为了访问,我使用: 这个控制器又返回student.jsp,当提交这个student.jsp时,它用-->@RequestMapping(value=“/AddStudent”,method=RequestMethod.post)调用controller 任何关于这通常如何工作的指示都将是有帮助的。 谢谢!