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手册 – 数组

感谢https://www.randomlists.com/things为“事物”;

虽然,如上所述,你可以在这里添加第二个参数来表明你想要一个数组返回:

 $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