ABucin ABucin - 4 months ago 32
Java Question

Java Jackson - prevent float to int conversion when deserializing

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;}
}


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.

Answer

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.

sample code:

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();
}
Comments