我有以下由长值组成的JsonArray:
[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
缩小了小数字 - Longs以节省内存 - 这就是为什么我在尝试使用Code时遇到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);
}
这如何运作?
答案 0 :(得分:1)
即使你不能从Integer
投射到Long
(由于班级等级,Integer
必须将Long
扩展到int
。 t),您可以从long
转换为php composer.phar dump-autoload -o
,这可能是此方法在幕后所做的事情。
答案 1 :(得分:1)
JSON没有Long或Integer的概念,只有number
的更一般的概念(参见json.org的JSON规范)。因此,由您的代码决定将特定JSON编号解析为什么对象(即Integer或Long)。
通过使用jsonArray.stream()
(返回Stream<Object>
),您允许Vertx
库决定将每个元素解析为哪个对象。在这种情况下,它会逐个为每个元素选择最合适的类型,即一些被解析为Long
,一些被解析为Integer
。如果你有1.5
这样的数字,这些可能会被解析为Double
(你需要检查一下)。
但是,通过使用jsonArray.getLong()
方法,您告诉Vertx
您已决定将每个元素解析为哪个对象(Long
)a因此,通过为每个元素选择最合适的类型,它不会试图变得聪明。如果你在这里有任何数字1.5
,这个方法可能会抛出异常(再次,你必须检查这个)。