2012-09-17 43 views
0

我有一個字符串值來自必須放入JSON的數據庫,但該值可以包含單引號和雙引號。聽起來很簡單,對吧?那麼,顯然不是在Java 1.4.2中。不要讓我開始爲什麼它必須是1.4.2,我從另一個開發人員那裏繼承了這一點,並且由於無法控制的因素,我們無法更新此項目。 :)Java 1.4 String.replaceAll單引號問題

所以,我已經嘗試了所有的這些(和許多其他人只是看到的結果):

"sample user's string".replaceAll("'", "\'")  // returns "sample user's string" 
"sample user's string".replaceAll("'", "\\'")  // returns "sample user's string" 
"sample user's string".replaceAll("'", "\\\'") // returns "sample user's string" 
"sample user's string".replaceAll("'", "\\\\'") // returns "sample user\\'s string" 
"sample user's string".replaceAll("'", "%%")  // returns "sample user%%s string" 

我要的就是sample user\'s string,我究竟做錯了什麼?太糟糕了1.4.2沒有String.replace(String,String)函數。

編輯:我們正在使用json-simple JSON庫,我正在查看所得JSON字符串中上述命令的輸出。我添加了額外的調試信息來查看JSON獲取輸出之前的值,它看起來像上面的命令真的在工作,但json-simple庫正在剝離轉義字符。

所以,我所看到的是:

"sample user's string".replaceAll("'", "\\\\'") // sample user\'s string 
myJSONObject.put("value", "sample user's string".replaceAll("'", "\\\\'")) // sample user\\'s string" 
myJSONObject.put("value", "sample user's string") // sample user's string 

所以它看起來像庫不太做的工作如預期。是否有人使用json-simple知道此解決方法?

回答

3

我懷疑你正在看上下文中的字符串,它會自動爲你跳出反斜槓。倒數第二個樣本應該沒問題。例如:

public class Test { 
    public static void main(String[] args) { 
     System.out.println("sample user's string".replaceAll("'", "\\\\'")); 
    } 
} 

打印:

sample user\'s string 

你沒有說你在哪裏看的價值,但如果是在調試器,可以很好地加倍給你反斜槓,以像在Java文字中一樣呈現該值。

理想情況下,你不應該手動做這種事情 - 這太容易出錯了。你應該使用一個JSON庫,它爲你處理所有這些,所以你需要只需要指定值。

+0

我同意不應該手動完成。我們使用'json-simple' JSON庫('GSON'庫與Java 1.4.2不兼容),沒有手動轉義,單引號不會被庫轉義。編輯問題的細節以反映這一點。 – Kettch19

+0

@ Kettch19:你是如何診斷報價沒有發生的?如果你不小心,我可以很容易地看到這是一個診斷問題,而不是其他問題。或者,也許json-simple很聰明,如果真的需要的話,也只是逃避引號。通過將包含單引號的字符串放入雙引號字符串中,反之亦然。 –

+0

我正在通過'log4j'輸出查看痕跡。 'json-simple'調用正在逃避其他字符,例如正斜槓,但出於某種原因,對於單引號沒有任何作用。事實上,當我把它們放入時,我的手動轉義序列正在無法使用。 – Kettch19