Json_encode/json_decode-在 PHP 中返回 stdClass 而不是 Array

看看这个小剧本:

$array = array('stuff' => 'things');
print_r($array);
//prints - Array ( [stuff] => things )
$arrayEncoded = json_encode($array);
echo $arrayEncoded . "<br />";
//prints - {"stuff":"things"}
$arrayDecoded = json_decode($arrayEncoded);
print_r($arrayDecoded);
//prints - stdClass Object ( [stuff] => things )

为什么 PHP 把 JSON 对象变成了一个类?

一个数组是 json_encoded然后 json_decoded不应该产生完全相同的结果吗?

114158 次浏览

仔细看看 https://secure.php.net/json_decodejson_decode($json, $assoc, $depth)的第二个参数

$arrayDecoded = json_decode($arrayEncoded, true);

给你一个数组。

还有一个很好的 PHP4 json encode/decode 库(甚至是 PHP5反向兼容库)在这篇博客文章中介绍过: 在 PHP4中使用 json _ encode ()和 json _ decode ()(2009年6月)

具体代码由 Michal Migurski 和 Matt Knapp 编写:

回答实际的问题:

Why does PHP turn the JSON Object into a class?

仔细看看编码后的 JSON 的输出,我扩展了 OP 给出的示例:

$array = array(
'stuff' => 'things',
'things' => array(
'controller', 'playing card', 'newspaper', 'sand paper', 'monitor', 'tree'
)
);
$arrayEncoded = json_encode($array);
echo $arrayEncoded;
//prints - {"stuff":"things","things":["controller","playing card","newspaper","sand paper","monitor","tree"]}

JSON 格式源自与 JavaScript (编程语言标准)相同的标准,如果你想看看它的格式,它看起来像 JavaScript。它是一个 JSON 对象({} = 对象) ,具有属性“ stuff”和值“ things”,并且具有属性“ things”,其值为字符串数组([] = array)。

JSON (作为 JavaScript)不知道关联数组,只知道索引数组。所以当 JSON 编码一个 PHP 关联数组时,这将导致一个包含这个数组作为“对象”的 JSON 字符串。

现在我们使用 json_decode($arrayEncoded)再次解码 JSON。Decode 函数不知道这个 JSON 字符串来自哪里(一个 PHP 数组) ,因此它将解码为一个未知对象,即 PHP 中的 stdClass。正如您将看到的,字符串的“ things”数组将解码成一个索引 PHP 数组。

参见:


感谢 https://www.randomlists.com/things的“东西”

tl;dr: JavaScript doesn't support associative arrays, therefore neither does JSON.

毕竟,是 JSON,不是 JSAAN。 :)

因此,PHP 必须将数组转换为对象才能将其编码为 JSON。

不过,正如前面提到的,您可以在这里添加第二个参数来表示希望返回一个数组:

$array = json_decode($json, true);

许多人可能更愿意选择投票结果:

$array = (array)json_decode($json);

可能读起来更清楚些。

    var_dump(json_decode('{"0":0}'));    // output: object(0=>0)
var_dump(json_decode('[0]'));          //output: [0]


var_dump(json_decode('{"0":0}', true));//output: [0]
var_dump(json_decode('[0]', true));    //output: [0]

如果将 json 解码为数组,则在这种情况下将丢失信息。