9

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

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

谢谢

4

2 回答 2

7

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

值可以是双引号中的字符串、数字、或truefalsenull、对象或数组。

对象和数组在 JSON 表示中都有特殊的语法(分别包装在{}和中),因此在任何情况下[]都不能混淆。false字符串也是如此 - 它包含在""(双引号)中。至于数字,它们必须至少包含一位数字 - 因此也不能与false(and trueand 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 设置为布尔值的唯一情况。

于 2013-10-27T23:52:13.297 回答
0

文档说values true, false and null (case-insensitive) are returned as TRUE, FALSE and NULL respectively.这意味着如果布尔值trueorfalse在要编码的对象中,它们将显示为TRUEor FALSE,对于 null 也是如此。例如:

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

会返回:

["hello",TRUE]

这并不意味着json_decode它将返回true,falsenull

于 2013-10-28T00:27:42.057 回答