一尘不染

Java Jackson-反序列化时防止将float转换为int

json

我有一个具有以下结构的JSON有效负载…

{
"age": 12
}

…映射到以下类:

public class Student {

    private Integer age;

    public Integer getAge(){return age;}
    public void setAge(Integer age){this.age = age;}
}

目前,如果用户提交的浮点值age,则将忽略小数,并且仅接受整数部分。我想要做的是防止用户提交带有浮动值的有效负载age(请参见下文)并引发异常(类似于“第8列第5行的“年龄”字段的JSON值无效”),这是标准做法反序列化失败时出现错误消息)。

{
"age": 12.7 // will be truncated to 12
}

我正在考虑为数字值实现自定义反序列化器,但想知道是否有更简单的方法来实现此目的。


阅读 765

收藏
2020-07-27

共1个答案

一尘不染

setter使用转换JSON字符串转换成Java对象时方法将被调用ObjectMapperreadValue()方法,在这里你可以检查值。查看String代替的setter方法的签名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();
}
2020-07-27