2013-10-27 140 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

相关问题