4

我们将 Jersey/Json (v1.12) 用于 JAX-RS Web 服务,并且我们输出 long 作为一些简单的 JAXB 对象编组的一部分。我们今天发现了一些东西,我环顾四周,看看这是否是一个普遍问题,但没有运气调试。

我们拥有的对象之一使用 long 作为唯一标识符(根据 java 规范, 2^63-1 ),即 ~ 9223372036854775807 (19 位左右)。

如果我们尝试输出长(17 位或更少的数字),我们会按预期(正确)输出。

如果我们尝试输出一个长(直到 2^63-1 为止的 18 位数字),我们会得到不正确的输出 - 它似乎将最后 2/3 有效数字四舍五入,例如:

@GET
@Path("/longTest")
@Produces("application/json")    
public JSONObject testLong() {
    JSONObject myObject = new JSONObject();
    try {
        myObject.put("1L", 1);
        myObject.put("13365766603759910L", 13365766603759910L);
        myObject.put("133614582656610538L", 133614582656610538L);
        myObject.put("9133614582656610538L", 9133614582656610538L);    
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return myObject;
}

返回:

{
   "1L":1,
   "13365766603759910L":13365766603759910,
   "133614582656610538L":133614582656610540,
   "9133614582656610538L":9133614582656610000
}

注意最后 2 个数字(538 - 540(18 位)和 538 - 000(19 位))的换行。

如果我直接将 long 编组为 json,它可以正常工作:

@GET
@Path("/longTest3")
@Produces("application/json")    
public long testLong3() {
    return 133614582656610538L;
}

返回:

133614582656610538

我在初始化我的网络服务器时添加了 POJO JSON 支持。

我应该为此使用不同的 JSONConfiguration 或 JAXBContextResolver 吗?

在此先感谢您的帮助!

4

0 回答 0