使用javax.json读取JSON UTC毫秒时间时出现信息丢失问题求助
问题分析与解决方案
没错,你猜的完全正确!这个问题就是long转int时的数值溢出导致的信息丢失。
先给你算个明白:你要读取的时间戳1526438700000是典型的UTC毫秒级时间,它的数值远大于Java中int类型的最大值——2^31-1也就是2147483647。当你调用getInt("time")时,javax.json会尝试把这个超出int范围的数值强行转成int,这就会触发整数溢出,得到一个完全错误的结果。
至于你说的“没有getLong方法”,其实是没找对正确的调用方式:javax.json的JsonObject确实没有直接的getLong,但它的getJsonNumber方法会返回一个JsonNumber对象,而这个对象提供了longValue()方法,可以安全地获取到long类型的数值。
正确的代码写法应该是这样的:
// 从JsonObject中获取时间戳对应的JsonNumber对象 JsonNumber timeJsonNum = jsonObj.getJsonNumber("time"); // 调用longValue()拿到正确的long类型时间戳 long timestamp = timeJsonNum.longValue();
如果是从JsonArray里读取的话,逻辑也是一样的:
// 假设你已经拿到了目标JsonArray和对应的索引index JsonObject targetObj = jsonArray.getJsonObject(index); JsonNumber timeJsonNum = targetObj.getJsonNumber("time"); long timestamp = timeJsonNum.longValue();
你之前尝试强制转换为long或者把变量声明为long没用,是因为getInt("time")已经在第一步就把数值转成了溢出后的int值,后续再转long也只是把错误的int值扩展成long,本质上还是错的。必须从源头就用JsonNumber的longValue()来获取正确的数值。
内容的提问来源于stack exchange,提问作者vathan
相关产品推荐
相关产品推荐

