2017-06-20 41 views
0

我正在编写一个程序来将包含纪元时间的JSON内容转换为XML格式的一个属性并将其存储在一个字符串中。对于纪元时间的JSONObject xml转换错误

下面是代码

String data = "{\"result\":\"pass\", \"timestamp\":1497870880.0396869183}"; 
JSONObject json = new JSONObject(data); //the json object contains proper epoch value after this line 
String event = XML.toString(json); 

当我打印字符串事件的内容,我得到

<result>pass</result><timestamp>1.497870880039687E9</timestamp> 

时间戳的值被改变。

但是,如果JSON内容具有划时代时间戳作为字符串,如

String data = "{\"result\":\"pass\", \"timestamp\":"1497870880.0396869183"}"; 

然后将生成的事件串给出正确的结果

<result>pass</result><timestamp>1497870880.0396869183</timestamp> 

可有人请解释为什么发生这种情况? JSON XML API对LONG值不友好吗? 注意:输入的JSON内容将包含具有字符串值和纪元时间的多个属性。

+0

它并不完全改变价值。它正在变为科学计数法 –

+0

在XML之前打印出JSONObject。问题可能是json库 –

+0

json对象具有正确和准确的epoch值和精确的内容作为json内容。问题发生在toString()调用之后。 –

回答

0

JSONObject将时间戳解析为Double,并且您看到的科学计数1.497870880039687E9只是Double的toString()的结果。

https://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#toString(double)

如果m大于或等于10^7小于10^3或,则在所谓的“计算机科学记数法”。设n是唯一整数,使得10^n≤m < 10^n + 1;那么让a是m和10^n的数学精确商,以便1≤a< 10.然后将幅度表示为a的整数部分,作为单个十进制数字,后面跟着'。'。 ('\ u002E'),后跟十进制数字,表示a的小数部分,后跟字母'E'('\ u0045'),后面跟着n表示十进制整数,如方法Integer所产生的。的toString(INT)。

如果你想保持原来的格式,你需要围绕价值data用引号这样的JSONObject认为这是一个字符串。

String data = "{\"result\":\"pass\", \"timestamp\":\"1497870880.0396869183\"}"; 
+0

感谢您的回复。你能否提一下在XML.toString()调用中避免这种情况的方法? –

+0

@DeepakSelvakumar除了像String那样传递值之外,没有别的办法。由于在JSONObject中转换为Double,时间戳会丢失不可逆的精度。 –