杰克逊将整数解析为双精度浮点数

3

环境:JACKSON 2.8.10Spring boot 1.5.10.RELEASE

在JSON请求中,我收到以下内容:

{
  total: 103
}

在其他情况下,total 可能带有小数精度,例如:103.25。我希望能够使用 JACKSON 处理这两种情况。
在我的 Java 代码中,我想将这个 103 读取为一个 double,如下所示:
Configuration conf = Configuration.builder().mappingProvider(new JacksonMappingProvider())
                .jsonProvider(new JacksonJsonProvider()).build();
Object rawJson = conf.jsonProvider().parse(payload);
double listPrice = JsonPath.read(rawJson, "$.total")

但是我接收到了以下错误:

Java.lang.Integer cannot be cast to java.lang.Double.

有没有一种方法可以处理上述情况而不进行字符串/数学操作?

1
你可以将你的 payload 定义为一个类,并让 total 成为一个 Double - alegria
@仪表板 我做不了那个。那需要进行太多重构。 - Airwavezx
1个回答

3
这个问题有没有不用进行字符串/数学操作的解决方法呢?
这应该可以解决。
Configuration conf = Configuration.builder()
       .mappingProvider(new JacksonMappingProvider())
       .jsonProvider(new JacksonJsonProvider())
       .build();
Object rawJson = conf.jsonProvider().parse(payload);
Object rawListPrice = JsonPath.read(rawJson, "$.total");
double listPrice;
if (rawListPrice instanceOf Double) {
    listPrice = (Double) rawListPrice;
} else if (rawListPrice instanceOf Integer) {
    listPrice = (Integer) rawListPrice;
} else {
    throw new MyRuntimeException("unexpected type: " + rawListPrice.getClass());
}

如果您要重复执行此操作,请创建一个方法...

public double toDouble(Object number) {
    if (number instanceof Double) {
        return (Double) number;
    } else if (number instanceof Integer) {
        return (Integer) number;
    } else {
        throw new MyRuntimeException("unexpected type: " + number.getClass());
    }
}

异常的根本原因是JsonPath.read返回类型是未受限制的类型参数。编译器会推断它为调用方所期望的任何类型,然后添加一个隐藏的强制类型转换来确保实际返回值具有预期的类型。
JsonPath.read在单个调用中实际上可以返回多种类型时,问题就出现了。编译器无法知道可能会返回什么或如何进行转换。
解决方法:通过一些运行时类型检查来处理转换。
下面是另一个应该可行的解决方法:
double listPrice = ((Number) JsonPath.read(rawJson, "$.total")).doubleValue();

如果JSON中"total"的值是字符串,那么你仍然会得到一个ClassCastException异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接