我使用Jackson
的ObjecMapper
将JSON数据反序列化到某个Java模型中。我也用@JsonProperty
注释字段/成员。
我想要实现的是配置ObjecMapper
这样的方式,反序列化过程不会失败,如果我收到一个JSON的键比预期的多,但我需要失败,如果由于某种原因映射(JSON)键在Java模型是不同的和/或缺失。
例如,这是Java类:
@Getter
@Setter
@ToString
@NoArgsConstructor
public final class CustomMessage {
@JsonProperty("first")
private String first;
@JsonProperty("second")
private Integer second;
@JsonProperty("third")
private Integer third;
}
我能收到的JSON数据必须有first
,second
和third
…但也可能有其他一些键,我要丢弃它们。
这是我目前为止写的:
new ObjectMapper().disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
.registerModule(new JavaTimeModule())
但仍然不工作;它不会失败,如果任何一个"必需的"JSON键没有发送-由于DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
.
应用程序不使用
Spring
或任何其他类似的框架。
Jackson有一个DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES
,您可以启用它,这样如果任何属性缺失,它将在反序列化期间失败并抛出JsonMappingException
。它的javadoc (ref)指定
所以你可以把public static final DeserializationFeature FAIL_ON_MISSING_CREATOR_PROPERTIES
如果一个或多个Creator属性(绑定到Creator方法(构造函数或静态工厂方法)的参数上的属性)缺少要从内容绑定到的值,确定会发生什么。如果启用,这样的缺失值会导致抛出JsonMappingException,其中包含丢失属性的第一个(按索引)的信息。如果禁用,并且如果属性未被标记为必需,则缺失的Creator属性将被反序列化器为参数类型提供的空值填充(通常为对象类型为空,为原语类型为默认值;但可以通过自定义反序列化器重新定义)。
ObjectMapper
创建为
new ObjectMapper().disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
.enable(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES)
.registerModule(new JavaTimeModule())
如果只有几个特定的属性是必需的,而不是所有的属性,你可以在必填字段上设置@JsonProperty
的required
参数(ref)为true
。例如,在您的情况下,如果只需要属性first
,
@Getter
@Setter
@ToString
@NoArgsConstructor
public final class CustomMessage {
@JsonProperty(value = "first", required = true)
private String first;
@JsonProperty("second")
private Integer second;
@JsonProperty("third")
private Integer third;
}