繁体   English   中英

Jackson将Integer解析为Double

[英]Jackson parse Integer to Double

环境: 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.

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

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

这应该做。

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”的值(例如)为String,您仍将获得ClassCastException

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM