在J中的Jackson JSON反序列化过程中,忽略缺少的属性

在这个例子中

class Person {
   String name;
   int age;
}

如果JSON对象缺少属性“ age”,

{
  name : John
}

Person person = objectMapper.readValue(jsonFileReader, Person.class);

它抛出JsonMappingException说它不能反序列化。 在反序列化期间是否有注释可以忽略丢失的字段?

谢谢

user379151 asked 2020-08-11T20:17:56Z
6个解决方案
77 votes

@JsonIgnoreProperties(ignoreUnknown = true)在课堂上为我工作。

Gustavo Matias answered 2020-08-11T20:18:31Z
46 votes

我想你想要的是

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class Person {
  ...
}

这就是Jackson 1.x的方式。 我认为2.x中有一种新方法。 就像是

@JsonInclude(Include.NON_NULL)
public class Person {
  ...
}

这些将告诉Jackson仅序列化不为null的值,并且在反序列化缺少的值时不会抱怨。 我认为它将只是将其设置为Java默认值。

pedorro answered 2020-08-11T20:18:11Z
24 votes

基于注释的方法是一种更好的忽略方法,但是如果需要的话。 手动反序列化的方式:

ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Person       person = mapper.readValue(jsonFileReader, Person.class);
Fırat KÜÇÜK answered 2020-08-11T20:18:51Z
5 votes

默认情况下,现代版本(2.9.6)的Jackson库将忽略缺少的创建者属性。 但是,如果将ObjectMapper配置设置为:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES, true);

如果缺少其中一个属性,则会收到反序列化错误。

Moisés answered 2020-08-11T20:19:15Z
1 votes

我认为您可能希望使用@JsonIgnore批注:[https://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonIgnore.html]

drembert answered 2020-08-11T20:19:35Z
0 votes

您也可以更改类以使用Integer而不是Int,在这种情况下,Jackson将正确处理null / missing“ age”值。 只需为寻找不涉及使用注释的替代方法的人添加此答案即可。

class Person {
   String name;
   Integer age;
}
mbonness answered 2020-08-11T20:19:56Z
translate from https://stackoverflow.com:/questions/20578846/ignore-missing-properties-during-jackson-json-deserialization-in-java