什么时候php json_decode返回false?

d-_*_*_-b 7 php json

在PHP文档,json_decode它说,它可以返回TRUE,FALSE,NULL.

有人可以帮我理解什么时候会回来FALSE吗?我知道无效的JSON会返回NULL,但是如果不是实际的JSON值,什么时候会返回其他两个?

谢谢

rai*_*7ow 6

JSON格式定义清楚地显示了所有可能的值及其表示:

值可以是双引号中的字符串,也可以是数字,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)
Run Code Online (Sandbox Code Playgroud)

从技术上讲,我们仍然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);
}
Run Code Online (Sandbox Code Playgroud)

......这是return_value设置为boolean的唯一情况.