如何使用@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 注释的替代(一般情况下推荐选择)。
要解决此问题,您需要:
- 告诉 jackson 忽略 属性
n_age
,否则你会因为无法识别的 属性 未标记为可忽略 - @JsonIgnoreProperties("n_age")
. 而得到异常
- 告诉 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;
}
}
我有 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
当前使用,它会将 属性 n_age
映射到字段 age
。引用 docs - 它可以作为更通用的 JsonProperty 注释的替代(一般情况下推荐选择)。
要解决此问题,您需要:
- 告诉 jackson 忽略 属性
n_age
,否则你会因为无法识别的 属性 未标记为可忽略 -@JsonIgnoreProperties("n_age")
. 而得到异常
- 告诉 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;
}
}