Vertx:我的由Long值组成的JsonArray突然变成了整数和长值的组合?

时间:2016-09-17 15:27:59

标签: java json int long-integer vert.x

我有以下由长值组成的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);
    }

这如何运作?

2 个答案:

答案 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,这个方法可能会抛出异常(再次,你必须检查这个)。