如何使用@JsonCreator 和@JsonGetter 反序列化JSON

How to deserialize JSON with @JsonCreator and @JsonGetter

我有 JSON 如下所示:

{
  "name":"John",
  "n_age":500
}

我有一个 class Person:

public class Person {
    private final String name;
    private final int age;

    @JsonCreator
    public Person(@JsonProperty("name") String name) {
        this.name = name;
        this.age = 100;
    }

    public String getName() {
        return name;
    }

    @JsonGetter("n_age")
    public int getAge() {
        return age;
    }
}

我需要反序列化和序列化它,但是当我尝试反序列化这个 JSON 时,我得到了意想不到的结果。

public static void main(String... args) {
    ObjectMapper mapper = new ObjectMapper();
    Person person = mapper.readValue(args[0], Person.class);
    System.out.println(person.getAge()); // I got 500, but I expect 100.
}

为什么在我尝试反序列化时使用了 @JsonGetter 注释?
当我尝试反序列化 JSON?

时,如何禁用 @JsonGetter 注释

如果 @JsonGetter 当前使用,它会将 属性 n_age 映射到字段 age。引用 docs - 它可以作为更通用的 JsonProperty 注释的替代(一般情况下推荐选择)。

要解决此问题,您需要:

  1. 告诉 jackson 忽略 属性 n_age,否则你会因为无法识别的 属性 未标记为可忽略 - @JsonIgnoreProperties("n_age").
  2. 而得到异常
  3. 告诉 jackson 允许 getter 忽略属性(基本上是只读的)- @JsonIgnoreProperties(value = {"n_age"}, allowGetters = true)

最后,Person应该是这样的:

@JsonIgnoreProperties(value = {"n_age"}, allowGetters = true)
public class Person {

    private final String name;
    private final int age;

    @JsonCreator
    public Person(@JsonProperty("name") String name) {
        this.name = name;
        this.age = 100;
    }

    public String getName() {
        return name;
    }

    @JsonGetter("n_age")
    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

我找到了解决我的问题的方法,也许这是一种不好的方法,但它对我也有效。我在反序列化期间忽略 n_age 属性 并在序列化期间允许吸气剂。 非常感谢@Chaosfire 的帮助!

@JsonIgnoreProperties({"n_age"}, allowGetters = true)
public class Person {

    private final String name;
    private final int age;

    @JsonCreator
    public Person(@JsonProperty("name") String name) {
        this.name = name;
        this.age = 100;
    }

    public String getName() {
        return name;
    }

    @JsonGetter("n_age")
    public int getAge() {
        return age;
    }
}