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)
伙计们,我可以在将小数反序列化为整数时让杰克逊失败吗?
非常感谢你们,伙计们!
有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 起可用
| 归档时间: |
|
| 查看次数: |
4138 次 |
| 最近记录: |