纪元时间的JSONObject xml转换错误

时间:2017-06-20 11:51:06

标签: java json xml epoch

我正在编写一个程序来转换JSON内容,其中包含一个属性的纪元时间到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内容将包含具有字符串值和纪元时间的多个属性。

1 个答案:

答案 0 :(得分:0)

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

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

  

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

如果你想保留原始格式,你需要用引号括住data中的值,以便JSONObject认为它是一个字符串。

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