什么时候php json_decode返回false?

时间:2013-10-27 23:50:59

标签: php json

json_decode的PHP文档中,它说它可以返回TRUEFALSENULL

有些人可以帮助我了解它何时返回FALSE?我理解无效的JSON将返回NULL,但是如果不是实际的JSON值,那么何时会返回其他两个?

由于

2 个答案:

答案 0 :(得分:6)

JSON format definition清楚地显示了所有可能的值及其表示形式:

  

值可以是双引号中的字符串,也可以是数字,或true或   falsenull,或对象或数组。

对象和数组在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的{​​{3}},检查参数后调用the source code。反过来,这首先调用php_json_decode_ex,它在预定义的parse_JSON_ex上运行;后者只有一组状态导致false值。如果此调用以某种方式失败,则会检查值state transition table

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的唯一情况。

答案 1 :(得分:0)

文档说values true, false and null (case-insensitive) are returned as TRUE, FALSE and NULL respectively.这意味着,如果布尔值truefalse位于要编码的对象中,则会显示为TRUE或{{ 1}},和null一样。例如:

FALSE

将返回:

json_decode('["hello",true]');

这并不意味着["hello",TRUE] 会返回json_decodetruefalse

的值