2016-09-23 54 views
1

我的目標是通過使用JSON格式來同步abitrary行數據。 由於我不知道行的確切方案(這是一種通用同步方法),我的數據模型顯然必須依賴「對象」。所以在Java中,我將有一個Map<String,Object>的數組與服務器同步。如何在使用moshi進行反序列化時區分長和雙值?

翻譯這樣的行成JSON會看到這樣的

{{"string":"stringvalue"},{"double1":1234.567},{"double2":1234.0},{"long":1234}} 

到目前爲止,一切都很好 - 沒有問題莫希 - 一切正常。

現在的問題:當我嘗試用moshi反序列化那個JSON時,我得到了「long」成員的double值。 Moshi將所有數字轉換爲雙精度。但不幸的是,並非所有數字都可以安全地轉換爲雙打。非常大的整數(aka longs)在雙精度的有限精度上存在問題。四捨五入效應也可能存在。

我開了一個問題與莫西,但不幸的是,已關閉。也許我還不夠清楚。 (Issue 192

JSON沒有整數的概念 - 只有數字和字符串。但從上面的示例中的「double2」的細微的細節可能會導致我的問題的解決方案:
如果一個數字不包含小數點,它是一個整數,應該轉換爲長整數。由於longs不能無損地轉換爲double,所以我需要一個方法在值轉換爲double之前攔截解析器。但如何做到這一點?

莫希具有JsonAdapters的這個方便的概念 - 但不幸的是我目前不知道怎樣才能在這種情況下使用它們:
輸入型的這樣一個JsonAdapter必須是對象,因爲我不能投了產生翻番。所以我必須在轉換任何值之前攔截解析器。
但是如何從那裏返回多個類型? (我必須從那裏返回字符串,雙精度或長度 - 或者如果我可以將輸入限制爲僅數字,我將至少必須返回長整數或雙精度。)

(我的後端是用PHP編寫的並自動生成所需的輸出:整數被寫入沒有小數點。)

回答

1

恐怕不改變Moshi源代碼是不可能的。 JSON字符串源通過JsonReader將所有數字轉換爲雙精度。我無法找到一種方法來改變這種行爲,因爲所有的子類都是封裝保護的。

相關問題