2012-08-14 167 views
2

在下面的代碼中,$ datastring變量中的JSON在JSONLint上作爲有效的JSON傳遞。JSONLint和PHP之間的差異JSON_DECODE

但是,使用PHP的json_encode時出現語法錯誤。

我能做些什麼來解決這個問題?我試過剝掉斜槓,但得到相同的錯誤。

$datastring = '[{"Program": 3034370,"Column": "CLI_RID","Value": "1006278"},{"Program": 3034370,"Column": "Filename","Value": "\\\\henery\\1006278\\CONFIRMATION LETTER AVAILABLE.html"},{"Program": 3034370,"Column": "EVENT_CODE","Value": "20120725ZZAQ"},{"Program": 3034370,"Column": "DOC_NAME","Value": "Confirmation Email"},{"Program": 3034370,"Column": "PrintDate","Value": "20120410"},{"Program": 2959623,"Column": "ISSUE","Value": "Res Spring"},{"Program": 2959623,"Column": "FILENAME","Value": "~/Res/Mag.aspx?I=res_spring&P=1006278"}]'; 
$data = json_decode($datastring, true); 

// Define the errors. 
$json_errors = array(
    JSON_ERROR_NONE => 'No error has occurred', 
    JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded', 
    JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded', 
    JSON_ERROR_SYNTAX => 'Syntax error', 
); 

if(!$data) { 
echo 'Last error : '. $json_errors[json_last_error()]. PHP_EOL. PHP_EOL; 
} else { 
echo print_r($data, true); 
} 

我將從ASP.Net頁面獲取此JSON字符串。

回答

3

如果你寫出一個字符串在一個PHP文字常量,你必須加倍所有的斜線。所以,當原始JSON是一樣的東西:

{"foo": "backslash: \\"} 

對應的PHP字符串文字是:

$json = '{"foo": "backslash: \\\\"}'; 
+0

反斜槓已經翻了一番。 – MB34 2012-08-14 20:38:57

+1

不,他們不是。該代碼包含PHP文字''「\\\\ henery \\ 1006278 \\ CONFIRMATION LETTER AVAILABLE.html」'',這是字符串'「\\ henery \ 1006278 \ CONFIRMATION LETTER AVAILABLE.html」'。在JSON中,字符串中的反斜槓必須被轉義,而'\ 1'是一個無效的文字。 – phihag 2012-08-15 05:41:52

0

您需要更多反斜槓,不能少於;由於您在字符串文字中使用PHP,因此PHP會自行剝離一層。

+0

它已經是翻了一番。 – MB34 2012-08-14 20:39:13

+1

@ MB34:IT需要被重複使用。 – 2012-08-14 20:52:14

+0

不能用addslashes做到這一點,因爲它也會將它們添加到引號中。 – MB34 2012-08-14 21:16:40