2013-05-15 239 views
23

我需要在JSON中發送日期。日期字符串應該是這樣的:JSONObject.toString:如何不逃避斜線

「2013年5月15日」

相反,JSONObject.toString逃脫它,如下所示:

「2013 \/10 \/15」

我明白,這樣做是爲了讓裏面的腳本標記JSON字符串,這個問題解釋說: JSON: why are forward slashes escaped?

但在我的情況下,我不需要它。事實上,服務器正在返回一個錯誤。服務器沒有處理這個問題,我無法修復服務器,所以我必須在移動客戶端代碼中修復它。

我可以序列化之後做了String.replace,但如果我其實是想包括在JSON的任何其他部分的「\ /」字符串?

有沒有一種方法來序列化一個JSON對象而不用斜線? (如果可能,無需任何轉義)

在此先感謝。

回答

6

我最終選擇將其發送到服務器之前在序列化的字符串替換逃脫斜線的快速和骯髒的伎倆。幸運的是,JSONObject也逃脫反斜槓,所以我也必須隱藏它們。現在,如果我想故意發送「\ /」,轉義字符串將是「\\ /」,並且替換的結果是原始字符串。

+0

這是如何這仍然發生很奇怪! Anywho,我做了一個字符串替換JSON字符串,並得到結果字符串,並將其傳遞給StringEntity。它像魔術一樣工作。謝謝,歡呼! – Migisha

2

行爲是硬編碼到JSONStringer.java,參見方法private void string(String value),線302+。

應該可以複製類JSONStringer並實現您自己的版本value(Object)(第227+行)。然後在實用程序類中實現自己的JSONObject .toString()版本,並使用您自己的JSONStringer代替原始代碼。

編輯:子類JSONStringer並不容易,因爲值()調用無法訪問的私有方法beforeValue()。

+1

也許另一個JSON庫也可以做你想做的事,例如看[google-gson](http://code.google.com/p/google-gson/)。 – devconsole

+0

你說得對。 'JsonWriter.setHtmlSafe'方法似乎正是這樣做的。默認設置是false,所以我猜這個庫會產生不固定的JSON字符串。我沒有時間去測試它,但如果你這樣做,我會接受這個解決方案:) –

0
jsonObjSend.toString().replace("\\\\","") 

爲我工作。有點詭計,但似乎沒有其他解決方案。

+3

'jsonObjSend.toString()。replace(「\\」,「」)''不適用於我,但是'jsonObjSend.toString()。replace(「\\\\」,「」)''工作。可能是什麼原因? –

0

我有JSONObject的一個類似的問題,「放」與數據處理的被編碼成ADAT烏里圖像時「數據:圖像/ PNG; BASE64,......」。 put函數會添加另一個斜槓來將格式更改爲「data:image/png; base64,.....」。看起來問題的根源在於JSONObject「put」函數中的字符串值檢查,該函數添加了額外的斜線。有人可能會重載函數或擴展類,但我發現最簡單的方法是添加一個唯一的字符串,如guid,然後在調用JSONObject的toString()函數後用您的Uri字符串替換該guid。

JSONObject userJson = new JSONObject(); 
String myimageUri = "data:image/png;base64,XXXDATAXXX"; 
userJson.put("imageUri", "b0c8f13d-48b1-46b4-af28-4e2d8004a6f8"); 
userJson.toString().replace("b0c8f13d-48b1-46b4-af28-4e2d8004a6f8", myimageUri);