环境:JACKSON 2.8.10
和Spring 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.
是否可以在不进行字符串/数学操作的情况下处理上述情况?
答案 0 :(得分: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
。