2014-07-08 68 views
-1

我已經看到了一些相關的答案,其中來自PHP的JSON字符串中的特定字符被轉換爲javascript友好版本。 隨着一些幫助,我已經走到這一步:在javascript中使用PHP生成的JSON:使用反斜槓的問題

  • JavaScript不處理反斜槓非常好,事實上這些都需要用雙反斜線來代替。
  • 新行字符\ r \ n不能很好地工作,無論您需要回車還是完全刪除符號。
  • 字符串中的雙引號需要通過'雙反斜槓'而不是單個引號進行轉義。
  • 通過路徑中的反斜槓顯示的正斜槓不需要轉義。下面

例如非工作JSON(在jsonlint得到證實,但在JSON.parse失敗)

["string\r\n next line \"quoted text\" and \b at path \/var\/opt "] 

我需要轉換爲替代以下後,使其工作

["string next line \\"quoted text\\" and \\b at path /var/opt "] 

問題

我的問題是,我在PHP中的JSON取決於我們呃輸入,我不知道他們會放什麼。 PHP將使用標準的json轉換方法並進行驗證。

像上面那樣,我還有其他應該覆蓋的場景,特別是unicode,其他特殊字符等嗎?

更新

我的JSON字符串比這個例子和動態變化更復雜一點,一個小例子是

{ "settings.conf": [ "tooltip='dynamic unicode text multiline with \ or \\ or even \" etc '", "value=the value"]} 

Im做

var jstring = <?php sanitize_json(json_encode($source_array)); ?> 

JSON.parse(jstring); 

和我sanitize_json功能目前正在做反斜槓替換並正在工作,但是我想包含換行符\ r \ n。還需要確保js中沒有其他類似json的問題。

+0

「我的問題是,我在PHP中的json取決於用戶的輸入,我不知道他們會放什麼。「來自用戶的任何輸入都應在處理之前進行消毒。 – Mooseman

+0

你能解釋一下這個問題嗎?對不起,但我無法掌握你的第一個字符串錯在哪裏 - 它會產生有效的對象(在JS中)。是否允許用戶製作自己的JSON,然後將其保存到DB,然後通過JSON.parse轉向JS對象? – eithed

回答

1

如果您看到json_encode()documentation您會看到有各種可以設置的標誌來清理數據。在你的情況,JSON_UNESCAPED_SLASHES可能做的伎倆:

json_encode($data, JSON_UNESCAPED_SLASHES);

+0

斜線(你的建議)不是反斜線(問題中的主要部分)。 – Sven

+0

我可能是錯的,但在不斷的JSON我提到的背景下,我的印象是一個反斜槓確實援引JSON常數頁面斜線 – Alex

+0

下:*「JSON_UNESCAPED_SLASHES(整數) 不要逃避/。自PHP 5.4.0起可用。「*這沒有提及或包含反斜槓*」\「* – Sven

2

你怎麼養活你的JSON字符串JSON.parse

我遇到了你的問題,只需執行這段JavaScript代碼:

JSON.parse('["string\r\n next line \"quoted text\" and \b at path \/var\/opt "]'); 

但事實是:雖然JSON字符串是有效的,它有一個JavaScript字符串的是一部分的情況下進行轉義。看起來在JSON字符串中的每個反斜線實際上都是javascript字符串的一部分 - 而包含「\ n」的JavaScript字符串將會將其轉換爲換行符。因此,寫入內存的數據不是您在源代碼中看到的文本。

var x = '["string\\r\\n next line \\"quoted text\\" and \\b at path \\/var\\/opt "]'; 
alert(x); // should show the original JSON string 
JSON.parse(x); // should work perfect then 

所以你的問題剛剛從轉換「我如何在PHP中創建一個有效的JSON字符串」到「如何正確把那個正確創建JSON字符串(在PHP json_encode()結果)我的JavaScript代碼裏面?」

我們需要一些更多的細節從你這裏,是因爲我會說,簡單地創建從JSON變量直接應該工作:的

var x = ["string\r\n next line \"quoted text\" and \b at path \/var\/opt "]; 

代替

var x = JSON.parse('["string\r\n next line \"quoted text\" and \b at path \/var\/opt "]'); 
+0

我最好的猜測是OP可能使用JSON.parse來確定輸入的JSON字符串是否正確(另一方面,他可以使用json_decode來做到這一點)。總體而言 - 很好寫。 – eithed