2009-06-04 120 views
42

即使轉義出現雙引號也會引發解析錯誤。
看看下面的代碼json用雙引號解析錯誤

//parse the json in javascript 
var testJson = '{"result": ["lunch", "\"Show\""] }'; 
var tags = JSON.parse(testJson); 
alert (tags.result[1]); 

這是因爲拋雙引號(已經轉義)的語法錯誤。
即使eval()也不會在這裏工作。
但是,如果我用雙斜線逃脫這樣的:

var result = '{"result": ["lunch", "\\"Show\\""] }'; 
var tags = JSON.parse(result); 
alert (tags.result[1]); 

然後正常工作。
爲什麼我們需要在JavaScript中使用雙斜線? 問題是,PHP json_encode()函數使用單斜槓(如:\"show\")轉義雙引號,JSON.parse將無法​​解析。我如何處理這種情況?

+1

變種的eval( '(' +導致+ ')'); – Priya 2011-12-29 07:44:24

回答

29

那麼,最後,JSON的解析使用相同的eval,所以當你給他們不明顯的時候沒有區別。語法不正確。在這種情況下,你必須正確地逃避PHP的報價,然後逃離他們和他們的逃逸與json_encode

<?php 
    $json = '{"result": ["lunch", "\"Show\""] }'; 
    echo json_encode($json); 
?> 

OUTPUT: "{\"result\": [\"lunch\", \"\\\"Show\\\"\"] }" 

這應該在客戶端的JS工作(如果我做了沒有錯別字)斜槓。

33

Javascript unescapes其字符串和json unescapes他們以及。 由json解析器看到的第一個字符串('{"result": ["lunch", "\"Show\""] }')爲 {"result": ["lunch", ""Show""] },因爲\"在JavaScript中表示",但不會退出雙引號字符串。

第二個字符串'{"result": ["lunch", "\\\"Show\\\""] }'首先取消轉義爲{"result": ["lunch", "\"Show\""] }(並且json正確轉義)。

我認爲,那'{"result": ["lunch", "\\"Show\\""] }'也應該工作。

+5

+1這實際上是正確的答案 – Christian 2011-01-28 23:31:04

8

docs

JSON_HEX_APOS(整數)所有'被轉換爲\ u0027
JSON_HEX_QUOT(整數)的所有「被轉換爲\ u0022

json_encode()有兩個參數,價值和選擇。所以試試

json_encode($result, JSON_HEX_QUOT); // or 
json_encode($result, JSON_HEX_QUOT | JSON_HEX_APOS); 

我還沒有t儘管如此。

+1

警告:json_encode()期望只有1個參數,2中給出... – 2011-07-17 04:49:08

+1

您正在使用PHP版本早於5.3.0,然後如文檔所示。 – raylu 2011-07-20 23:36:56

+0

這就是答案,但它應該是以 – nus 2012-07-18 09:43:15

2

關閉magic_quotes_gpcphp.ini

10

此問題是由雙摺疊字符串轉義機制引起的:一個來自JS,一個來自JSON。

將反斜槓字符與另一個後續字符組合的組合用於表示一個字符,該字符在字符串中不可表示。 ''\\''代表'\'等。

這個轉義機制發生在JSON.parse()工作之前。

例如

var parsedObj = JSON.parse('{"sentence": "It is one backslash(\\\\)"}'); 
console.log(parsedObj.sentence); 
>>>"It is one backslash(\)" 

從字符串發生器的角度來看,它傳遞四個齒隙 '\' 進入的JavaScript解釋器。

從JavaScript解釋器的角度來看,它解釋了有兩個反斜槓(\),因爲每個'\'序列將被解釋爲一個'\'。

從JSON解析器的角度來看,它收到兩個反斜槓(\\),JSON字符串轉義規則會將其解析爲一個單獨的'\',即輸出結果。

解釋你第一代碼:

var testJson = '{"result": ["lunch", "\"Show\""] }'; 
//The real string after sequence escaping in to JS is 
//'{"result": ["lunch", ""Show""] }' 
//which is passed into the JSON.parse. 
//Thus, it breaks the JSON grammar and generates an error 
var tags = JSON.parse(testJson); 
alert (tags.result[1]); 
1

PHP來JavaScript對象(PHP> = 5.3.0)

var storesLocations = JSON.parse('<?php echo addslashes(json_encode($storesLocations,JSON_HEX_APOS | JSON_HEX_QUOT)) ?>');