在它的 PHP 文档中json_decode
说它可以返回TRUE
, FALSE
, NULL
.
有人可以帮助我了解它何时会返回FALSE
吗?我知道无效的 JSON 会返回NULL
,但是如果不是实际的 JSON 值,其他两个什么时候会返回?
谢谢
在它的 PHP 文档中json_decode
说它可以返回TRUE
, FALSE
, NULL
.
有人可以帮助我了解它何时会返回FALSE
吗?我知道无效的 JSON 会返回NULL
,但是如果不是实际的 JSON 值,其他两个什么时候会返回?
谢谢
JSON 格式定义清楚地显示了所有可能的值及其表示:
值可以是双引号中的字符串、数字、或
true
或false
或null
、对象或数组。
对象和数组在 JSON 表示中都有特殊的语法(分别包装在{}
和中),因此在任何情况下[]
都不能混淆。false
字符串也是如此 - 它包含在""
(双引号)中。至于数字,它们必须至少包含一位数字 - 因此也不能与false
(and true
and 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_ex。反过来,这首先调用parse_JSON_ex,它对预定义的状态转换表进行操作;后者只有一组导致false
值作为结果的状态。如果此调用以某种方式失败,则直接检查值:
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 设置为布尔值的唯一情况。
文档说values true, false and null (case-insensitive) are returned as TRUE, FALSE and NULL respectively.
这意味着如果布尔值true
orfalse
在要编码的对象中,它们将显示为TRUE
or FALSE
,对于 null 也是如此。例如:
json_decode('["hello",true]');
会返回:
["hello",TRUE]
这并不意味着json_decode
它将返回true
,false
或null