我有一个JSON有效载荷,其结构如下......
{
"age": 12
}
...映射到以下类:
public class Student {
private Integer age;
public Integer getAge(){return age;}
public void setAge(Integer age){this.age = age;}
}
目前,如果用户提交age
的浮点值,则忽略小数,并且只接受整数部分。我想要做的是阻止用户提交具有age
的浮点值的有效负载(见下文)并抛出异常(例如"字段' age&#的无效JSON值) 39;在第8行col 5" - 反序列化失败时的标准消息。)
{
"age": 12.7 // will be truncated to 12
}
我正在考虑为数值实现自定义反序列化器,但是想知道是否有更简单的方法来实现这一点。
答案 0 :(得分:10)
关闭ACCEPT_FLOAT_AS_INT。您可以在https://github.com/FasterXML/jackson-databind/wiki/Deserialization-Features
查看更多详情答案 1 :(得分:7)
使用ObjectMapper
的readValue()
方法将json字符串转换为java对象时,将调用setter
方法,您可以在其中检查值。查看接受String
而不是Integer
的setter方法的签名。
示例代码:
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();
}
答案 2 :(得分:4)
默认情况下,默认情况下,浮点值将从Jackson 2.6截断为整数值。如上一个答案所示,将ACCEPT_FLOAT_AS_INT
设置为false
可以解决您的问题。
@Test(expected = JsonMappingException.class)
public void shouldFailMarshalling() throws IOException {
final String student = "{\"age\": 12.5}";
final ObjectMapper mapper = new ObjectMapper();
// don't accept float as integer
mapper.configure(ACCEPT_FLOAT_AS_INT, false);
mapper.readValue(student, Student.class);
}