Java 使Jackson在反序列化过程中无法将double转换为int

Java 使Jackson在反序列化过程中无法将double转换为int,java,json,jackson,deserialization,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 <

我使用
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": 0.1
}
现在我得到了
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);
伙计们,我能让Jackson在将十进制反序列化为整数时失败吗


非常感谢你们,伙计们

为此,有一个选项
ACCEPT\u FLOAT\u AS\u INT
。例如:

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.ACCEPT_FLOAT_AS_INT);
对于
“0.1”
,您将获得:

线程“main”中出现异常 com.fasterxml.jackson.databind.JsonMappingException:无法强制 将浮点值('0.1')转换为整数;使可能
反序列化功能。接受\u FLOAT\u作为\u INT
以允许

你可以看到相关的文档


请注意,这是从Jackson 2.6开始提供的,您可以为JSON文档定义JSON模式,并在反序列化到Java对象之前运行验证

如果将
中值
属性定义为
整数
类型,则将拒绝浮点数

这种方法还可以解决允许接受表示整数的浮点数的问题,例如
2.0
。架构需要定义
中值
属性,如下所示:

{
  ...
  "median": { "type": "number", "multipleOf": 1.0 }
}

太多了!它很好用。有点遗憾的是,
2.0
无法使用此功能转换为
2
。不管怎样,它比我以前做得好得多。又来了,伙计!非常感谢你,RZet!Manos建议的方法比定义JSON模式容易得多。传统上,JSON模式不能解决成功的
2.0
(十进制)到
2
(整数)转换的问题。不管怎么说,thanx很多,伙计。我会记住的。@danissimo希望我更新的帖子能让你一石二鸟哈哈;
{
  ...
  "median": { "type": "number", "multipleOf": 1.0 }
}