当前位置: 首页 > 面试题库 >

Java Jackson-反序列化时防止将float转换为int

伯君浩
2023-03-14
问题内容

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

{
"age": 12
}

…映射到以下类:

public class Student {

    private Integer age;

    public Integer getAge(){return age;}
    public void setAge(Integer age){this.age = age;}
}

目前,如果用户提交的浮点值age,则将忽略小数,并且仅接受整数部分。我想要做的是防止用户提交带有浮动值的有效负载age(请参见下文)并引发异常(类似于“第8列第5行的“年龄”字段的JSON值无效”),这是标准做法反序列化失败时出现错误消息)。

{
"age": 12.7 // will be truncated to 12
}

我正在考虑为数字值实现自定义反序列化器,但想知道是否有更简单的方法来实现此目的。


问题答案:

setter使用转换JSON字符串转换成Java对象时方法将被调用ObjectMapperreadValue()方法,在这里你可以检查值。查看String代替的setter方法的签名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();
}


 类似资料:
  • 问题内容: 如何从float转换为string或从string转换为float? 在我的情况下,我需要在2个值字符串(我从表中获得的值)和我计算出的浮点值之间进行断言。 我尝试从浮动到字符串: 但是断言失败 问题答案: 使用Java的类。 为了进行比较,将字符串转换为float并比较两个float总是更好。这是因为对于一个浮点数,存在多个字符串表示形式,与字符串相比,它们是不同的(例如“ 25”!

  • 我有一个类,它用这个函数反序列化泛型的ArrayList,就像这个线程的第一个答案中描述的:Java抽象类函数泛型类型 Eclipse要求我强制转换TypeToken,结果如下(sinde fromJson的函数需要一个类型,而不是一个TypeToken) 结果我得到了这个错误: 在gson用户手册中,他们告诉您这是调用函数的正确方式 我看不出我做错了什么(如果它是一个有效的答案,为什么我会得到这

  • 我想进一步说明这个问题是关于什么的,我已经漫游了一个小时了,但没有找到任何东西。 更糟糕的是,正如您所看到的,该属性是final(这就是为什么我热衷于通过反序列化在实例化时使用Jackson反射能力)。我已经阅读了关于以不同的方式注释setter和getter的潜在解决方案,但如果可能的话,我希望将此属性保留为最终属性。如果不可能,我会接受一个非最终财产。 我希望答案不建议自定义序列化/反序列化,

  • 问题内容: 所以我在这里想要做的是获取a ,将其转换为,作为数据报包通过网络发送,然后在接收终端将其转换回a 。 现在我知道我可以转换到使用方法。但是我不知道如何逆转换。 问题答案: 我认为您想利用具有和方法的类。

  • 问题内容: 我正在尝试将字符串转换为,但是得到了。 我的字串是,现在我将其转换为我所拥有的任何一个。 我如何将其转换为它们中的任何一个。 请帮助我摆脱这个问题。 问题答案: 您必须为数字使用适当的语言环境,例如 版画

  • 我想在Swift中将转换为。像这样的基本强制转换不起作用,因为这些类型不是原语,不像Objective-C中的s和s