使杰克逊在反序列化期间无法将 double 转换为 int

dan*_*imo 4 java json jackson deserialization

Jackson用来将 JSON 反序列化为不可变的自定义 Java 对象。这是课程:

final class DataPoint {
  private final int count;
  private final int median;

  @JsonCreator
  DataPoint(
      @JsonProperty("count") int count,
      @JsonProperty("median") int median) {
    if (count <= 0) {
      throw new IllegalArgumentException("...");
    }
    this.count = count;
    this.median = median;
  }

  // getters...
}
Run Code Online (Sandbox Code Playgroud)

这是我反序列化的 JSON:

{
  "count": 1,
  "median": 2
}
Run Code Online (Sandbox Code Playgroud)

它工作正常。现在我打破了 JSON,即用median小数替换整数:

{
  "count": 1,
  "median": 0.1
}
Run Code Online (Sandbox Code Playgroud)

现在我得到count == 1, 和median == 0。相反,我希望 Jackson 无法反序列化,因为 JSON 属性的数据类型median和形median参类型 (an int) 不同,并且转换实际上会丢失数据。

这是反序列化代码:

String json = "..."; // the second JSON
ObjectMapper mapper = new ObjectMapper()
    .enable(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES)
    .enable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES)
    .enable(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE);
DataPoint data = mapper.readValue(json, DataPoint.class);
Run Code Online (Sandbox Code Playgroud)

伙计们,我可以在将小数反序列化为整数时让杰克逊失败吗?

非常感谢你们,伙计们!

Man*_*dis 5

ACCEPT_FLOAT_AS_INT为此目的的选择。例如:

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.ACCEPT_FLOAT_AS_INT);
Run Code Online (Sandbox Code Playgroud)

而对于"0.1"你将得到:

线程“main”com.fasterxml.jackson.databind.JsonMappingException 中的异常:无法将浮点值('0.1')强制转换为整数;启用 DeserializationFeature.ACCEPT_FLOAT_AS_INT允许

您可以在此处查看相关文档

请注意,这自 Jackson 2.6 起可用