在Java中进行Jackson JSON反序列化期间忽略缺少的属性

gab6jxml  于 2022-11-09  发布在  Java
关注(0)|答案(7)|浏览(275)

在本例中

class Person {
   String name;
   int age;
}

如果JSON对象缺少属性“age,”
第一个
它抛出一个JsonMappingException,表示它不能反序列化。是否有一个 annotation 在反序列化过程中忽略缺少的字段?

zazmityj

zazmityj1#

@JsonIgnoreProperties(ignoreUnknown = true)对我很有效。

0vvn1miw

0vvn1miw2#

我觉得你想要的是

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

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

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

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

wfypjpf4

wfypjpf43#

基于注解的方法是一种更好的方法,可以忽略但如果需要的话。

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

k5ifujac4#

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

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

然后,如果缺少其中一个属性,则会出现反序列化错误。

nnt7mjpx

nnt7mjpx5#

你也可以改变你的类,使用Integer而不是int,在这种情况下Jackson会正确处理null/缺失的“age”值。

class Person {
   String name;
   Integer age;
}
sc4hvdpw

sc4hvdpw6#

在反序列化中,可能会发生两件事。
我们有一个JSON字符串(而不是Java Bean)中的新字段,它将是对象Map器的未知属性。要忽略该未知属性,需要按如下方式配置对象Map器配置

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

如果某个字段不是JSON字符串,而是Java Bean,则该字段将被对象Map器视为缺少的属性。要避免在缺少属性时失败,对象Map器配置需要按如下方式配置,但这是Jackson库的现代版本(2.9.6)的默认行为。
ObjectMapper().configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES, false)

lstz6jyr

lstz6jyr7#

如果您使用@JsonProperty(access = JsonProperty.Access.READ_ONLY)对age进行注解,则仅在反序列化期间才会忽略它。

相关问题