我使用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 == 1
和median == 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);
伙计们,我可以让杰克逊在将十进制数量化为整数时失败吗?
非常感谢,伙计们!
答案 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