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 这样的数字,这个方法可能会抛出一个异常(同样,你必须检查这个)。