在反序列化期间,让杰克逊失败,将double转换为int

时间:2017-05-05 09:53:20

标签: 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...
}

这是我反序列化的JSON:

{
  "count": 1,
  "median": 2
}

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

{
  "count": 1,
  "median": 0.1
}

现在我得到count == 1median == 0。相反,我希望杰克逊失败deserilizing,因为JSON属性median和正式median参数类型(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);

伙计们,我可以让杰克逊在将十进制数量化为整数时失败吗?

非常感谢,伙计们!

2 个答案:

答案 0 :(得分:2)

为此目的有选项ACCEPT_FLOAT_AS_INT。例如。 :

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.ACCEPT_FLOAT_AS_INT);

对于"0.1",你会得到:

  

线程中的异常&#34; main&#34;   com.fasterxml.jackson.databind.JsonMappingException:无法强制执行   浮点值(&#39; 0.1&#39;)为整数;启用   DeserializationFeature.ACCEPT_FLOAT_AS_INT允许

您可以查看相关文档here

请注意,这可以从Jackson 2.6开始使用

答案 1 :(得分:1)

您可以为JSON文档定义JSON模式,并在反序列化之前运行验证到Java对象中。

如果将median属性定义为integer类型,则将拒绝浮点数。

此方法还可以解决允许代表float numbers的{​​{1}}被接受的问题,例如integers。模式需要定义2.0属性,如下所示:

median