Java Jackson - 在反序列化时阻止float到int的转换 [英] Java Jackson - prevent float to int conversion when deserializing

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

问题描述

我有一个具有以下结构的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 的浮点值的有效负载(见下文)并抛出异常(类似于字段的无效JSON值 'age'在第8行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.

推荐答案

setter 方法ObjectMapper.htmlrel =noreferrer> ObjectMapper readValue() 方法,您可以在其中检查价值。查看setter方法的签名,该签名接受 String 而不是 Integer

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 - 在反序列化时阻止float到int的转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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