2012-01-18 88 views
12

我在這裏有點困惑。如果我通過一個變量json_decode,這是行不通的:爲什麼json_decode不適合我?

$stringJSON = $_GET['jsonstring']; 
echo $stringJSON; 
$stringObject = json_decode($stringJSON); 
var_export($stringObject); 

第一回聲正確地顯示我的JSON字符串我通過,例如

{\"Items\":[{\"Name\":\"name\",\"Description\":\"\"],\"Name\":\"Christmas\"} 

第二個回顯顯示NULL。 所以我抓住從第一回波串並寫入下面的代碼:

$stringObject = json_decode("{\"Items\":[{\"Name\":\"name\",\"Description\":\"\"],\"Name\":\"Christmas\"}"); 
var_export ($stringObject); 

和你說什麼做什麼,它讓我看到正確解碼陣列。字符串是完全一樣的,我甚至保留了轉義字符。或者,也許他們是問題?

回答

24

看起來您的服務器啓用了magic_quotes_gpc。使用前請使用disable it或運行$stringJSONstripslashes()

$stringJSON = get_magic_quotes_gpc() ? 
    stripslashes($_GET['jsonstring']) : $_GET['jsonstring']; 
+1

如果它包含UTF編碼的文本,它將被破壞,因爲它也將被刪除 – tom10271 2015-09-09 02:51:30

+0

@aokaddaoc你當然是對的。最好的選擇是禁用魔術引號 – Phil 2015-09-09 05:27:04

1

如果它顯示出一個帶有斜線的字符串,那麼當您使用echo時,這意味着該字符串中有斜槓。這不是一個有效的JSON字符串,斜槓不屬於那裏。如果您將該字符串粘貼到PHP中,則斜線由PHP進行評估。 PHP源代碼中的字符串文字"\""的計算結果爲字符串",所以斜線被有效刪除,並且您正在解碼有效的JSON字符串。

我懷疑你有Magic Quotes哪些插入斜槓到GET值,關閉它們。

5

[{\"Name\":\"name\",\"Description\":\"\"] 

需求是

[{\"Name\":\"name\",\"Description\":\"\"}] 

你缺少收盤}

+0

奇怪的是,OP的第二個例子在所有 – Phil 2012-01-18 03:29:36

1

這是一個引用的問題:請嘗試以下

$stringObject = json_decode("{\"Items\":[{\"Name\":\"name\",\"Description\":\"\"],\"Name\":\"Christmas\"}"); 
echo $stringObject; 
var_export ($stringObject); 

如你所見,在$ stringObject沒有引號(但一從$ _GET未來有他們)

,所以你可能需要

$stringJSON = $_GET['jsonstring']; 
$stringObject = json_decode(stripslashes($stringJSON)); 
var_export($stringObject); 
0

運行json_decode兩次。

$str = json_decode($jsonData,true); 
$str = json_decode($str,true); 

它可以幫助某人。

1
json_encode($str, JSON_UNESCAPED_SLASHES); 

它可以幫助你。