【问题标题】:JSONObject xml conversion error for epoch time纪元时间的 JSONObject xml 转换错误
【发布时间】:2017-11-22 22:51:27
【问题描述】:

我正在编写一个程序来将包含一个属性中的纪元时间的 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>

timestamp的值改变了。

但如果 JSON 内容具有纪元时间戳作为字符串,例如

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

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

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

谁能解释一下为什么会这样? JSON XML API 对 LONG 值不友好吗? 注意:输入的 JSON 内容将包含具有字符串值和纪元时间的多个属性。

【问题讨论】:

  • 价值并没有完全改变。它正在变为科学计数法
  • 在 XML 之前打印出 JSONObject。问题可能是json库
  • json 对象具有正确和准确的纪元值和准确的内容作为 json 内容。问题发生在 toString() 调用之后。

标签: java json xml epoch


【解决方案1】:

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

如果要保持原始格式,则需要将data 中的值用引号括起来,以便 JSONObject 认为它是一个字符串。

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

【讨论】:

  • 感谢您的回复。您能否提及在 XML.toString() 调用中避免这种情况发生的任何方法?
  • @DeepakSelvakumar 除了将值作为字符串传递之外,别无他法。由于 JSONObject 中的 Double 转换,时间戳失去了不可逆的精度。
猜你喜欢
  • 2018-06-05
  • 2015-06-21
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 2021-01-23
  • 1970-01-01
相关资源
最近更新 更多