2017-06-20 30 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,時間戳會丟失不可逆的精度。 –