Java Jackson - prevent float to int conversion when deserializing

前端 未结 3 898
孤独总比滥情好
孤独总比滥情好 2020-12-16 18:27

I have a JSON payload with the following structure ...

{
\"age\": 12
}

... which is mapped to the following class:

public c         


        
相关标签:
3条回答
  • 2020-12-16 18:33

    A floating-point value will be truncated to an integer value by default from Jackson 2.6. As indicated in a previous answer, setting ACCEPT_FLOAT_AS_INT to false should fix your problem.

    @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);
    }
    
    0 讨论(0)
  • 2020-12-16 18:38

    Toggle off ACCEPT_FLOAT_AS_INT. You can check more details at https://github.com/FasterXML/jackson-databind/wiki/Deserialization-Features

    0 讨论(0)
  • 2020-12-16 18:40

    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();
    }
    
    0 讨论(0)
提交回复
热议问题