在本例中
class Person { String name; int age; }
如果JSON对象缺少属性“age,”第一个它抛出一个JsonMappingException,表示它不能反序列化。是否有一个 annotation 在反序列化过程中忽略缺少的字段?
JsonMappingException
zazmityj1#
@JsonIgnoreProperties(ignoreUnknown = true)对我很有效。
@JsonIgnoreProperties(ignoreUnknown = true)
0vvn1miw2#
我觉得你想要的是
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class Person { ... }
这是Jackson 1.x的方式。我认为在2.x中有一种新的方式。类似于
@JsonInclude(Include.NON_NULL) public class Person { ... }
这将告诉Jackson只序列化非空的值,并且在反序列化缺少的值时不抱怨。我认为它只会将其设置为Java默认值。
wfypjpf43#
基于注解的方法是一种更好的方法,可以忽略但如果需要的话。
ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); Person person = mapper.readValue(jsonFileReader, Person.class);
k5ifujac4#
Jackson库的现代版本(2.9.6)默认情况下将忽略缺少的创建者属性。但是,如果ObjectMapper配置设置为:
ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES, true);
然后,如果缺少其中一个属性,则会出现反序列化错误。
nnt7mjpx5#
你也可以改变你的类,使用Integer而不是int,在这种情况下Jackson会正确处理null/缺失的“age”值。
class Person { String name; Integer age; }
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)
ObjectMapper().configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES, false)
lstz6jyr7#
如果您使用@JsonProperty(access = JsonProperty.Access.READ_ONLY)对age进行注解,则仅在反序列化期间才会忽略它。
7条答案
按热度按时间zazmityj1#
@JsonIgnoreProperties(ignoreUnknown = true)
对我很有效。0vvn1miw2#
我觉得你想要的是
这是Jackson 1.x的方式。我认为在2.x中有一种新的方式。类似于
这将告诉Jackson只序列化非空的值,并且在反序列化缺少的值时不抱怨。我认为它只会将其设置为Java默认值。
wfypjpf43#
基于注解的方法是一种更好的方法,可以忽略但如果需要的话。
k5ifujac4#
Jackson库的现代版本(2.9.6)默认情况下将忽略缺少的创建者属性。但是,如果ObjectMapper配置设置为:
然后,如果缺少其中一个属性,则会出现反序列化错误。
nnt7mjpx5#
你也可以改变你的类,使用Integer而不是int,在这种情况下Jackson会正确处理null/缺失的“age”值。
sc4hvdpw6#
在反序列化中,可能会发生两件事。
我们有一个JSON字符串(而不是Java Bean)中的新字段,它将是对象Map器的未知属性。要忽略该未知属性,需要按如下方式配置对象Map器配置
如果某个字段不是JSON字符串,而是Java Bean,则该字段将被对象Map器视为缺少的属性。要避免在缺少属性时失败,对象Map器配置需要按如下方式配置,但这是Jackson库的现代版本(2.9.6)的默认行为。
ObjectMapper().configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES, false)
lstz6jyr7#
如果您使用@JsonProperty(access = JsonProperty.Access.READ_ONLY)对age进行注解,则仅在反序列化期间才会忽略它。