在PHP文档,json_decode它说,它可以返回TRUE,FALSE,NULL.
有人可以帮我理解什么时候会回来FALSE吗?我知道无效的JSON会返回NULL,但是如果不是实际的JSON值,什么时候会返回其他两个?
谢谢
JSON格式定义清楚地显示了所有可能的值及其表示:
值可以是双引号中的字符串,也可以是数字,
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_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设置为boolean的唯一情况.