2016-09-17 50 views
0

我有以下JsonArray由長值:Vertx:由Long值組成的My JsonArray突然變爲Integer值和Long值的混合?

[1234567873,852369471,9517,789 ,4826,96127435] 
    Long , Long ,Long,Long,Long, Long 

發送後在eventbus有一個JsonArray由整型和長的:

[1234567873,852369471,9517 ,789 ,4826 ,96127435] 
    Long , Long ,Integer,Integer,Integer,Long 

Obiously Vertx縮小少數多頭以節省內存 - 這就是爲什麼我得到Cannot cast from Integer to Long -ClassCastException當我嘗試以下代碼:

List<Long> collect = jsonArray.stream().map(element -> (Long) element).collect(Collectors.toList()); 

與以下Codeline作品相比:

for (int jsonArrayIndex = 0; jsonArrayIndex < jsonArray.size(); jsonArrayIndex++) { 
     Long longValue = jsonArray.getLong(jsonArrayIndex); 
    } 

這是如何工作的?

回答

1

JSON沒有Long或Integer的概念,只有更一般的概念number(請參閱json.org上的JSON規範)。因此,決定用什麼對象(即Integer或Long)來解析特定的JSON數字取決於您的代碼。

通過使用jsonArray.stream()(它返回Stream<Object>),您允許Vertx庫決定將每個元素解析爲哪個對象。在這種情況下,它爲每個元素逐一選擇最合適的類型,即某些元素被解析爲Long,一些元素被解析爲Integer。如果你有任何數字,如1.5,這些可能會被解析爲Double(你需要檢查這個雖然)。

然而,通過使用jsonArray.getLong()方法,你告訴Vertx決定什麼對象來解析每一個元素代入式(一Long)一個,因此它不會嘗試通過選擇最合適的類型,每個聰明元件。如果您在此處有任何號碼(如1.5),則此方法可能會引發異常(同樣,您必須檢查此項)。

1

即使壽你不能從Integer轉換爲Long(因爲類層次的,Integer將不得不延長Long它不),你可以從int轉換爲long,這可能是這種方法確實背後的是什麼場景。