忽略在 Java 中 Jackson JSON 反序列化过程中丢失的属性

在例子中

class Person {
String name;
int age;
}

如果 JSON 对象缺少属性‘ age’,

{
"name": "John"
}
Person person = objectMapper.readValue(jsonFileReader, Person.class);

它抛出一个 JsonMappingException表示它不能反序列化。在反序列化过程中是否有一个 注释来忽略丢失的字段?

128545 次浏览

我觉得你想要的是

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

这是 Jackson 1. x 的方式。我认为2. x 中有一种新的方式。类似于

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

这将告诉 Jackson 只序列化非空的值,并且在反序列化丢失的值时不要抱怨。我认为它只会将其设置为 Java 默认值。

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

ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Person       person = mapper.readValue(jsonFileReader, Person.class);

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

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

然后,如果缺少一个属性,就会得到一个反序列化错误。

您还可以将类更改为使用 Integer 而不是 int,在这种情况下 Jackson 将正确处理 null/丢失的“ age”值。只是为那些寻找不涉及使用注释的替代方案的人添加这个答案。

class Person {
String name;
Integer age;
}

如果您使用@JsonProperty (access = JsonProperty. Access.READ _ ONLY)注释 age,那么它将只在反序列化期间被忽略。

在 Deserialization,可能会发生两件事。

我们有 JSON 字符串中的一个新字段,而不是 JavaBean 中的,这将是一个 对象映射器的未知属性。要忽略未知属性,需要按以下方式配置对象映射器配置

ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

如果一个字段是 不是在 JSON 字符串中,而是在 JavaBean 中,那么该字段将被视为 对象映射器缺少的属性。为了不会在缺少属性时失败,对象映射器配置需要配置如下,但这是 Jackson 库的 Modern 版本(2.9.6)的默认行为。

ObjectMapper().configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES, false)