在json_decode
的PHP文檔中,它表示它可以返回TRUE
,FALSE
,NULL
。什麼時候php json_decode返回false?
有些人能幫我理解什麼時候會返回FALSE
?我知道無效的JSON將返回NULL
,但是如果不是實際的JSON值,何時會返回其他兩個?
由於
在json_decode
的PHP文檔中,它表示它可以返回TRUE
,FALSE
,NULL
。什麼時候php json_decode返回false?
有些人能幫我理解什麼時候會返回FALSE
?我知道無效的JSON將返回NULL
,但是如果不是實際的JSON值,何時會返回其他兩個?
由於
JSON format definition清楚地顯示了所有可能的值和它們的表示:
值可以是在雙引號的字符串或數字,或
true
或false
或null
或對象或一個數組。
這兩個對象和陣列具有在JSON表示(包裹在分別{}
和[]
)特殊語法,所以它們不能被在任何情況下與false
混合起來。字符串也是如此 - 它被包裹在""
(雙引號)中。至於Numbers,它們必須包含至少一個數字 - 因此不能與false
(和true
和null
)混淆。
因此,我們唯一的例子就是:當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被設置爲布爾的唯一案例。
哈哈......但這是唯一的方法?我想知道什麼時候它不會返回'NULL'或json值本身之外的其他東西 –
換句話說,你在問什麼'false'值可以以任何其他方式編碼,而不是字符串'false'(case不敏感的)? – raina77ow
是的,這是我的問題 –
文檔說values true, false and null (case-insensitive) are returned as TRUE, FALSE and NULL respectively.
這意味着,如果布爾true
或false
是在對象進行編碼,它們將顯示爲TRUE
或FALSE
,與同爲空。例如:
json_decode('["hello",true]');
將返回:
["hello",TRUE]
這並不意味着json_decode
將返回true
,false
,或null
我的確讀過這個問題,並且你沒有提到關於錯誤地解釋文檔的內容,也沒有對它進行評論。換句話說,你沒有理由低估了我的答案 – Markasoftware
從價值觀是什麼,我可以看到,那隻回報如果這是解碼的實際值,則爲「TRUE」或「FALSE」。 –
它不會說它返回true或false – Markasoftware
「如果不是實際的JSON值」對不起,但是什麼讓你相信'true'或'false'可以在任何其他情況下返回? – RandomSeed