Java Jackson - 在反序列化时阻止float到int的转换

时间:2014-08-01 08:32:27

标签: java json jackson deserialization

我有一个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
}

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

3 个答案:

答案 0 :(得分:10)

关闭ACCEPT_FLOAT_AS_INT。您可以在https://github.com/FasterXML/jackson-databind/wiki/Deserialization-Features

查看更多详情

答案 1 :(得分:7)

使用ObjectMapperreadValue()方法将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);
}