Java Jersey/JAXB编组问题具有长精度
我们将Jersey/Json(v1.12)用于JAX-rsweb服务,并将long作为一些简单JAXB对象编组的一部分输出。我们今天发现了一些问题,我环顾了一下四周,看看这是否是一个普遍问题,但没有成功调试 我们有一个对象使用long作为唯一标识符(根据java规范,2^63-1),即~9223372036854775807(19位左右) 如果我们尝试输出一个长的(17或更少的数字),我们得到了预期的输出(正确) 如果我们尝试输出一个长的(直到2^63-1为止的18位数字),我们会得到错误的输出-它似乎将最后的2/3位有效数字四舍五入,例如:Java Jersey/JAXB编组问题具有长精度,java,jaxb,jersey,Java,Jaxb,Jersey,我们将Jersey/Json(v1.12)用于JAX-rsweb服务,并将long作为一些简单JAXB对象编组的一部分输出。我们今天发现了一些问题,我环顾了一下四周,看看这是否是一个普遍问题,但没有成功调试 我们有一个对象使用long作为唯一标识符(根据java规范,2^63-1),即~9223372036854775807(19位左右) 如果我们尝试输出一个长的(17或更少的数字),我们得到了预期的输出(正确) 如果我们尝试输出一个长的(直到2^63-1为止的18位数字),我们会得到错误的输出
@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
}
133614582656610538
注意最后两个数字(538-540(18位)和538-000(19位))的包装
如果我直接将long转换为json,它可以正常工作:
@GET
@Path("/longTest3")
@Produces("application/json")
public long testLong3() {
return 133614582656610538L;
}
返回:
{
"1L":1,
"13365766603759910L":13365766603759910,
"133614582656610538L":133614582656610540,
"9133614582656610538L":9133614582656610000
}
133614582656610538
我在初始化Web服务器时添加了POJO JSON支持
我应该为此使用不同的JSONConfiguration或JAXBContextResolver吗
提前感谢您的帮助 可能是个虫子。您可以通过将中的值作为字符串读取并使用XmlAdapter将其转换为长字符串来解决问题。如果注释了setter而不是成员属性本身,例如setId(Long id),则可以提取基元类型并将其分配给正确类型的成员。但是,如果您将这些id用于XmlID和XmlIDREFS,这些都不起作用。现在是2013年,史蒂夫!