与JSON_DECODE第二个参数混淆

时间:2016-07-27 12:17:30

标签: php arrays json

我刚刚创建了一个小程序来检查JSON和JSON_FORCE_OBJECT

$tree =  [
    0 => array
    (
        'id' => 1,
        'parent' => '0',
        'name' => 'b',
        'surname' => 'myfolder/b'
    ),

    1 => array
    (
        'id' => 2,
        'parent' => 1,
        'name' => 'ignore',
        'surname' => 'myfolder/ignore2'
    ),

    2 => array
    (
        'id' => 3,
        'parent' => 1,
        'name' => 'ignore2',
        'surname' => 'myfolder/ignore4'
    )

];
var_dump($tree);
$try = json_encode($tree);//To print with key. Also if we decode we get result as object
//echo $try;
echo '<br />';
$try2 = json_decode($try,JSON_FORCE_OBJECT);
var_dump($try2);

$ try2完全等于$ tree一个关联数组。 而如果我从此行中删除JSON_FORCE_OBJECT

$try2 = json_decode($try,JSON_FORCE_OBJECT);

我得到一个带有子对象的数组。虽然JSON_FORCE_OBJECT应该与json_encode一起使用但是与json_decode一起使用,但我得到了一个令人惊讶的结果。我无法理解里面发生了什么?我想当我编码并解码它时我应该得到相同的结果。但是只有在我使用JSON_FORCE_OBJECT时才得到相同的结果。谁能帮助为什么会这样呢?

2 个答案:

答案 0 :(得分:1)

根据手册:http://php.net/manual/en/function.json-decode.php

json_decode如果要在objects中转换它们,则会返回assoc array数组,您应该指定第二个参数boolean

JSON_FORCE_OBJECTint,其值为16 ... 当这个被传递为第二个参数php时,将其转换为其等同于true的bool等。

要测试上述行为,请尝试:

var_dump((bool)1; (bool)2, (bool)16) 
//output  bool(true)  bool(true)  bool(true) . 
var_dump((bool)0)
//outputs bool(false)

所以这与JSON_FORCE_OBJECT无关......甚至

json_decode($try,true);
json_decode($try,2);
json_decode($try,3);
json_decode($try,4);
json_decode($try,'someVar');
....
//should return your expected result (assoc array)

同样,如果你传递0作为第二个参数,PHP会将其转换为boolfalse)并返回object

json_decode($try,0);
json_decode($try,false); 
json_decode($try,null)
json_decode($try)
...
//will return objects

答案 1 :(得分:1)

json_decode的第二个参数是布尔值。它接受truefalse。它不接受JSON_FORCE_OBJECT。您试图使用错误的常量来处理错误的函数。

json_decode&#39> 4th 参数接受常量的位掩码,但目前它只支持JSON_BIGINT_AS_STRING

如果要从stdClass返回JSON对象的json_decode个实例,请将其第二个参数设置为false(默认值)。将其设置为任何非假值都会使其返回关联数组而不是对象。将其设置为JSON_FORCE_OBJECT计为&#34; not-falsey&#34;。

手册中描述了所有内容:http://php.net/json_decode