Vertx:我的由长值组成的 JsonArray 突然变成了整数值和长值的混合?
Vertx: My JsonArray consisting of Long values becomes suddenly a mix of Integer- and Long-Values?
我有以下由长值组成的 JsonArray:
[1234567873,852369471,9517,789 ,4826,96127435]
Long , Long ,Long,Long,Long, Long
通过事件总线发送后,有一个由整数和长整数组成的 JsonArray:
[1234567873,852369471,9517 ,789 ,4826 ,96127435]
Long , Long ,Integer,Integer,Integer,Long
显然 Vertx
缩小小数字-Longs 以节省内存 - 这就是我在尝试以下代码时得到 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);
}
这是如何工作的?
即使你不能从 Integer
转换为 Long
(因为 class 层次结构,Integer
必须扩展 Long
没有),你可以从 int
转换为 long
,这可能就是这个方法在幕后所做的。
JSON 没有 Long 或 Integer 的概念,只有 number
的更通用的概念(参见 json.org 的 JSON 规范)。因此,由您的代码决定将特定 JSON 数字解析为哪个对象(即 Integer 或 Long)。
通过使用 jsonArray.stream()
(其中 returns 和 Stream<Object>
),您允许 Vertx
库决定将每个元素解析为哪个对象。在这种情况下,它会为每个元素一个一个地选择最合适的类型,即一些被解析为 Long
,一些被解析为 Integer
。如果你有任何像 1.5
这样的数字,它们可能会被解析为 Double
(不过你需要检查一下)。
但是,通过使用 jsonArray.getLong()
方法,您告诉 Vertx
您 已经决定将每个元素解析为哪个对象(一个 Long
) a 因此它不会通过为每个元素选择最合适的类型来尝试变得聪明。如果你在这里有任何像 1.5
这样的数字,这个方法可能会抛出一个异常(同样,你必须检查这个)。
我有以下由长值组成的 JsonArray:
[1234567873,852369471,9517,789 ,4826,96127435]
Long , Long ,Long,Long,Long, Long
通过事件总线发送后,有一个由整数和长整数组成的 JsonArray:
[1234567873,852369471,9517 ,789 ,4826 ,96127435]
Long , Long ,Integer,Integer,Integer,Long
显然 Vertx
缩小小数字-Longs 以节省内存 - 这就是我在尝试以下代码时得到 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);
}
这是如何工作的?
即使你不能从 Integer
转换为 Long
(因为 class 层次结构,Integer
必须扩展 Long
没有),你可以从 int
转换为 long
,这可能就是这个方法在幕后所做的。
JSON 没有 Long 或 Integer 的概念,只有 number
的更通用的概念(参见 json.org 的 JSON 规范)。因此,由您的代码决定将特定 JSON 数字解析为哪个对象(即 Integer 或 Long)。
通过使用 jsonArray.stream()
(其中 returns 和 Stream<Object>
),您允许 Vertx
库决定将每个元素解析为哪个对象。在这种情况下,它会为每个元素一个一个地选择最合适的类型,即一些被解析为 Long
,一些被解析为 Integer
。如果你有任何像 1.5
这样的数字,它们可能会被解析为 Double
(不过你需要检查一下)。
但是,通过使用 jsonArray.getLong()
方法,您告诉 Vertx
您 已经决定将每个元素解析为哪个对象(一个 Long
) a 因此它不会通过为每个元素选择最合适的类型来尝试变得聪明。如果你在这里有任何像 1.5
这样的数字,这个方法可能会抛出一个异常(同样,你必须检查这个)。