2013-10-27 174 views
7

json_decode的PHP文檔中,它表示它可以返回TRUEFALSE,NULL什麼時候php json_decode返回false?

有些人能幫我理解什麼時候會返回FALSE?我知道無效的JSON將返回NULL,但是如果不是實際的JSON值,何時會返回其他兩個?

由於

+0

從價值觀是什麼,我可以看到,那隻回報如果這是解碼的實際值,則爲「TRUE」或「FALSE」。 –

+0

它不會說它返回true或false – Markasoftware

+0

「如果不是實際的JSON值」對不起,但是什麼讓你相信'true'或'false'可以在任何其他情況下返回? – RandomSeed

回答

6

JSON format definition清楚地顯示了所有可能的值和它們的表示:

值可以是在雙引號的字符串或數字,或truefalsenull或對象或一個數組。

這兩個對象和陣列具有在JSON表示(包裹在分別{}[])特殊語法,所以它們不能被在任何情況下與false混合起來。字符串也是如此 - 它被包裹在""(雙引號)中。至於Numbers,它們必須包含至少一個數字 - 因此不能與false(和truenull)混淆。

因此,我們唯一的例子就是:當json_encode處理一個已經重新定義了它的JSON表示的對象時。例如(PHP 5.4+):

class FalsyFoo implements JsonSerializable { 
    public $foo; 

    public function __construct($f) { 
    $this->foo = $f; 
    } 

    public function jsonSerialize() { 
    return false; 
    } 
} 

$f = new FalsyFoo(true); 
$fj = json_encode($f); 
var_dump($fj); // string(5) 'false' 
var_dump(json_decode($fj)); // bool(false) 

技術上,我們仍然在這裏false價值的工作,但來源明顯不同。


如果你仍然不服氣,檢查json_decode,其中檢查參數之後調用php_json_decode_exthe source code。這又首先調用parse_JSON_ex,其在預定義的state transition table上操作;後者只有一組狀態導致false值。如果該調用不知何故失敗,值被檢查directly

if (str_len == 4) { 
    if (!strcasecmp(str, "null")) { 
    /* We need to explicitly clear the error 
     because its an actual NULL and not an error */ 
    jp->error_code = PHP_JSON_ERROR_NONE; 
    RETVAL_NULL(); 
    } else if (!strcasecmp(str, "true")) { 
    RETVAL_BOOL(1); 
    } 
} else if (str_len == 5 && !strcasecmp(str, "false")) { 
    RETVAL_BOOL(0); 
} 

...這時候RETURN_VALUE被設置爲布爾的唯一案例。

+0

哈哈......但這是唯一的方法?我想知道什麼時候它不會返回'NULL'或json值本身之外的其他東西 –

+0

換句話說,你在問什麼'false'值可以以任何其他方式編碼,而不是字符串'false'(case不敏感的)? – raina77ow

+0

是的,這是我的問題 –

0

文檔說values true, false and null (case-insensitive) are returned as TRUE, FALSE and NULL respectively.這意味着,如果布爾truefalse是在對象進行編碼,它們將顯示爲TRUEFALSE,與同爲空。例如:

json_decode('["hello",true]'); 

將返回:

["hello",TRUE] 

這並不意味着json_decode將返回truefalse,或null

+0

我的確讀過這個問題,並且你沒有提到關於錯誤地解釋文檔的內容,也沒有對它進行評論。換句話說,你沒有理由低估了我的答案 – Markasoftware

相關問題