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
参数类型(anint
)是不同的,转换实际上会丢失数据
以下是反序列化代码:
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 }
}