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
的数组产生EXACT相同的结果?
仔细看看json_decode($json, $assoc, $depth)
的第二个参数http://docs.php.net/json_decode
$arrayDecoded = json_decode($arrayEncoded, true);
给你一个数组。
回答实际的问题
为什么PHP把JSON对象变成一个类?
仔细看一下编码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( ECMAScript编程语言标准 )相同的标准衍生而来的,如果您看起来像JavaScript那样的格式。 它是一个JSON 对象 ( {}
=对象 ),它具有值“things”的属性“stuff”,并具有属性“things”,其值是一个string数组( []
= array )。
JSON(如JavaScript)不知道关联数组只有索引数组。 所以当编码一个PHP关联数组的JSON时,这将导致一个包含这个数组的JSONstring作为“对象”。
现在我们使用json_decode($arrayEncoded)
再次解码JSON。 解码函数不知道这个JSONstring来自哪里(一个PHP数组),所以它解码成一个未知的对象,这是PHP中的stdClass
。 正如你将会看到的,string的“东西”数组将会解码成索引的PHP数组。
另请参阅:
- RFC 4627 – JavaScript对象的application / json媒体types
- RFC 7159 – JavaScript对象表示法(JSON)数据互换
- PHP手册 – 数组
虽然,如上所述,你可以在这里添加第二个参数来表明你想要一个数组返回:
$array = json_decode($json, true);
许多人可能更喜欢投入结果:
$array = (array)json_decode($json);
阅读可能会更清楚。
tl; dr:JavaScript不支持关联数组,因此JSON也不支持。
毕竟,这是JSON,而不是JSAAN。 🙂
所以PHP必须将你的数组转换成一个对象才能编码成JSON。
PHP4(2009年6月)中使用了json_encode()和json_decode()方法,也有一个很好的PHP 4 json编码/解码库(甚至是PHP 5反向兼容) 。
具体代码由Michal Migurski和Matt Knapp提供:
- JSON-PHP / 2005年1月
- 代码: http : //mike.teczno.com/JSON/JSON.phps
- 梨build议: http : //pear.php.net/pepr/pepr-proposal-show.php?id=198
- 梨包: http : //pear.php.net/package/Services_JSON