在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