jackson 将ObjecMapper配置为需要Map的键,但在发送未Map的键时不会失败

ebdffaop  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(101)

我正在使用JacksonObjecMapper将JSON数据反序列化到某个Java模型中。
我尝试实现的是以这样的方式配置ObjecMapper:如果我收到的JSON包含的键比预期的多,反序列化过程不会失败,但如果由于某种原因Java模型中的Map(JSON)键不同和/或缺失,我需要失败。
例如,这是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数据必须包含firstsecondthird ...但也可以包含其他一些键,我将丢弃这些键。
这是我目前所掌握的情况:

new ObjectMapper().disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
  .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
  .registerModule(new JavaTimeModule())

但还是不起作用;如果由于DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES的原因,没有发送任何"必需的" JSON密钥,它也不会失败。
应用程序不使用Spring或任何其他类似的框架。

8fsztsew

8fsztsew1#

Jackson有一个DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES,您可以启用它,这样如果缺少任何属性,它将在反序列化过程中失败并抛出JsonMappingException
公共静态最终反序列化功能FAIL_ON_MISSING_CREATOR_PROPERTIES
此功能可确定如果一个或多个创建者属性(绑定到Creator方法(构造函数或静态工厂方法)的参数的属性)缺少要从内容绑定到的值。如果启用,此类缺少的值将导致引发JsonMappingException,并显示有关第一个值的信息(按索引)。如果禁用,并且属性未标记为必需,缺少的Creator属性由反序列化程序为参数类型提供的空值填充(通常为Object类型的空值,以及原语的默认值;但可通过定制的反串行化器重新定义)。
因此,您可以将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())

如果只需要几个特定属性而不是所有属性,您可以在必填字段中将@JsonPropertyrequired参数(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;
}

相关问题