Java Jackson - 反序列化时防止浮点数转换为整数 [英] Java Jackson - prevent float to int conversion when deserializing

查看:46
本文介绍了Java Jackson - 反序列化时防止浮点数转换为整数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

目前,如果用户提交age的浮点值,小数将被忽略,只接受整数部分.我想要做的是阻止用户提交带有 age 浮点值的有效负载(见下文)并抛出异常(类似于第 8 行字段‘年龄’的无效 JSON 值)col 5" - 反序列化失败时的标准消息).

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.

推荐答案

使用 ObjectMapperreadValue() 方法,您可以在其中检查值.查看接受 String 而不是 Integer 的 setter 方法的签名.

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.

示例代码:

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

这篇关于Java Jackson - 反序列化时防止浮点数转换为整数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆