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

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.

解决方案

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值