首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jackson-databind 2.5将浮点数转换为int

Jackson-databind 2.5将浮点数转换为int
EN

Stack Overflow用户
提问于 2017-02-13 09:42:05
回答 1查看 1.3K关注 0票数 0

jackson-databind 2.5中的DeserializationFeature.ACCEPT_FLOAT_AS_INT的替代方案是什么,因为这种反序列化配置在2.5中不可用(自2.6以来就可用了)

我们的应用程序正在使用jackson 2.5,其中我们注意到浮点数正在转换为int。

我们认为,我们需要禁用值转换、强制。但是由于我们使用的是Jackson2.5,所以没有 DeserializationFeature.ACCEPT_FLOAT_AS_INT

如何在2.5中禁用浮点到int的转换?如果用户在"age“中提供浮点(而不是int ),我们期望用户获得数据验证异常。

下面是示例POJO

代码语言:javascript
复制
public class User {

    private String name;
    private Integer age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}

这是测试代码(使用jackson-databind 2.5):

代码语言:javascript
复制
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class TestConvert {

    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {

        ObjectMapper mapper = new ObjectMapper();
        String json = "{\"name\" : \"foobar\", \"age\" : 2.99}";

        //JSON from file to Object
        User user = mapper.readValue(json, User.class);

        //Object to JSON in String
        String jsonInString = mapper.writeValueAsString(user);
        System.out.println(jsonInString);


    }

}

上述测试代码的输出如下:

{“名称”:“foobar”,“年龄”:2}

EN

回答 1

Stack Overflow用户

发布于 2017-02-13 11:04:28

像这样更改您的用户类:

代码语言:javascript
复制
package ch.hasselba.jackson.test2;

import com.fasterxml.jackson.databind.JsonMappingException;

public class User {

    private String name;
    private int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(Object age) throws JsonMappingException {

        if( age instanceof Float )
            throw new com.fasterxml.jackson.databind.JsonMappingException("Bad Age! No Floats allowed!");
        if( age instanceof Double )
            throw new com.fasterxml.jackson.databind.JsonMappingException("Bad Age! No Doubles please!");

        this.age = (Integer) age;
    }

}

您将收到这样的错误:

代码语言:javascript
复制
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Bad Value! No Doubles please
 at [Source: {"name" : "foobar", "age" : 2.99}; line: 1, column: 29] (through reference chain: ch.hasselba.jackson.test2.User["age"])
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:268)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty._throwAsIOE(SettableBeanProperty.java:537)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty._throwAsIOE(SettableBeanProperty.java:518)
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:99)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:276)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3789)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2833)
    at ch.hasselba.jackson.test2.TestConvert.main(TestConvert.java:19)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Bad Value! No Doubles please
    at ch.hasselba.jackson.test2.User.setAge(User.java:24)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:97)
    ... 5 more

Jackson2.8.0和禁用的DeserializationFeature.ACCEPT_FLOAT_AS_INT的错误如下所示:

代码语言:javascript
复制
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Can not coerce a floating-point value ('2.99') into Integer; enable `DeserializationFeature.ACCEPT_FLOAT_AS_INT` to allow
 at [Source: {"name" : "foobar", "age" : 2.99}; line: 1, column: 29] (through reference chain: ch.hasselba.jackson.test2.User["age"])
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:261)
    at com.fasterxml.jackson.databind.DeserializationContext.reportMappingException(DeserializationContext.java:1233)
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer._failDoubleToIntCoercion(StdDeserializer.java:1118)
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseInteger(StdDeserializer.java:430)
    at com.fasterxml.jackson.databind.deser.std.NumberDeserializers$IntegerDeserializer.deserialize(NumberDeserializers.java:308)
    at com.fasterxml.jackson.databind.deser.std.NumberDeserializers$IntegerDeserializer.deserialize(NumberDeserializers.java:286)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:490)
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:95)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:276)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3789)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2833)
    at ch.hasselba.jackson.test2.TestConvert.main(TestConvert.java:19)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42200936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档