在Java中使用Jackson JSON反序列化时忽略缺少的属性

时间:2013-12-14 01:56:14

标签: java json serialization jackson

在示例中

class Person {
   String name;
   int age;
}

如果JSON对象缺少属性'age',

{
  name : John
}

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

它会抛出一个JsonMappingException,说它无法反序列化。是否有注释在反序列化期间忽略缺少的字段?

由于

7 个答案:

答案 0 :(得分:68)

课堂上的

@JsonIgnoreProperties(ignoreUnknown = true)为我工作。

答案 1 :(得分:42)

我认为你想要的是

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class Person {
  ...
}
这是Jackson 1.x的方式。我认为在2.x中有一种新的方式。像

这样的东西
@JsonInclude(Include.NON_NULL)
public class Person {
  ...
}

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

答案 2 :(得分:19)

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

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

答案 3 :(得分:3)

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

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

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

答案 4 :(得分:1)

答案 5 :(得分:1)

如果你用@JsonProperty(access = JsonProperty.Access.READ_ONLY) 注释年龄,它只会在反序列化过程中被忽略。

答案 6 :(得分:0)

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

class Person {
   String name;
   Integer age;
}