【问题标题】:Jackson parse Integer to Double杰克逊将整数解析为双精度
【发布时间】:2018-08-05 11:45:08
【问题描述】:

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

有没有办法在不进行字符串/数学运算的情况下处理上述情况?

【问题讨论】:

  • 您可以将payload 定义为一个类,并让total 成为Double
  • @dashboard 我做不到。它涉及太多重构。

标签: java spring-boot jackson jackson-databind


【解决方案1】:

有没有办法在不进行字符串/数学运算的情况下处理上述情况?

应该这样做。

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

【讨论】:

    猜你喜欢
    • 2013-06-09
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2018-08-25
    • 2019-07-27
    • 2014-08-22
    • 2019-11-25
    相关资源
    最近更新 更多