Java Jackson - 在反序列化时阻止float到int的转换 [英] Java Jackson - prevent float to int conversion when deserializing
问题描述
我有一个具有以下结构的JSON有效负载......
I have a JSON payload with the following structure ...
{
"age": 12
}
...映射到以下类:
... which is mapped to the following class:
public class Student {
private Integer age;
public Integer getAge(){return age;}
public void setAge(Integer age){this.age = age;}
}
目前,如果用户提交年龄的浮动值
,忽略小数,并且只接受整数部分。我想要做的是阻止用户提交具有 age
的浮点值的有效负载(见下文)并抛出异常(类似于字段的无效JSON值 'age'在第8行col 5 - 反序列化失败时的标准消息。)
At the moment, if the user submits a float value for the age
, the decimals are ignored and the only the integer part is accepted. What I want to do is prevent the user from submitting a payload with a float value for the age
(see below) and throw an exception (something like "invalid JSON value for field 'age' at line 8 col 5" - as is the standard message when deserialization fails).
{
"age": 12.7 // will be truncated to 12
}
我在考虑实施一个数字值的自定义反序列化器,但想知道是否有更简单的方法来实现这一点。
I was thinking of implementing a custom deserializer for numeric values but was wondering if there is a simpler way to achieve this.
推荐答案
setter
方法ObjectMapper.htmlrel =noreferrer> ObjectMapper
的 readValue()
方法,您可以在其中检查价值。查看setter方法的签名,该签名接受 String
而不是 Integer
。
The setter
method will be called when converting json string into java object using ObjectMapper
's readValue()
method where you can check for value. Look at the setter method's signature that accepts String
instead of Integer
.
示例代码:
class Student {
private int age;
public int getAge() {
return age;
}
public void setAge(String ageString) {
System.out.println("called");
try {
age = Integer.parseInt(ageString);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("age can't be in float");
}
}
}
...
try {
Student student = new ObjectMapper().readValue("{\"age\": 12.5}", Student.class);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
这篇关于Java Jackson - 在反序列化时阻止float到int的转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!