簡體   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