1

PHP 函数 json_decode(默认)返​​回一个对象。切换第二个参数将返回一个数组。

也许我只是不了解对象,但我认为对象具有属性和方法(也许也有事件)。数组只有属性。

鉴于 json_decode 只会返回属性而不会返回方法,它不应该总是返回一个数组吗?

4

4 回答 4

9

它返回一个对象,因为 JSON 定义了一个对象结构。这就是“JS O N”中的“O”所代表的意思。

这就是语言之间的差异开始变得更加明显的地方。

Javascript 使用对象,而 PHP 可能使用带有命名键的数组。JS 不能在数组中有命名键,只能在对象中。其他语言对如何构造变量有其他限制。

使用对象意味着 PHP 与 JSON 的其他语言实现尽可能一致。由于 JSON 是为跨语言通信而设计的,因此保持一致很重要。

但是正如您所说,在 PHP 中使用数组有时更容易,所以这就是 PHP 提供将​​其直接转换为数组的选项的原因。

But be aware that PHP arrays are not the same as JSON arrays and objects. PHP allows you to mix named and numbered array keys. This does not map well to JSON, so if you're using PHP arrays to work with JSON you have to be careful of it. If you're using PHP objects for your JSON work, then you won't have this mismatch in functionality.

于 2012-09-13T06:55:19.103 回答
3

好的,看来您已经知道了:

默认情况下,json_decode将返回一个 StdClass 对象。如果你想要一个数组,请使用:

json_decode($jsondata, true);

见: http: //php.net/manual/en/function.json-decode.php

所以,回答“为什么”:

JSON 是一种用于存储分层数据集的格式,类似于过去使用 XML 的方式。然而,因为 Javascript 针对访问对象属性进行了优化,所以不需要额外的库来处理 JSON 结构——它们是 Javascript 中的实际对象。

解析 JSON 比解析 XML 更容易,并且相对容易翻译成后端语言中的对象和/或数组。在 PHP 之外的许多语言中,有一种称为 Dictionary 或 Hashtable 的东西,它通常是具有键/值对的对象。

除了上下文之外,PHP 不会区分数组和“关联数组”,因此对于 PHP 开发人员来说,期望结果是关联数组是很自然的,并且该选项存在,但最有可能是为了灵活性(也许是因为它更自然地解码为对象)对象格式存在。

我希望这能解释。我还强烈建议您在此处进一步了解 JSON 是什么(不是什么):http: //json.org

于 2012-09-13T06:45:34.793 回答
0

json_decode默认情况下从stdClass类返回一个对象。这是对象的基本(顶级)泛型类。这个类首先没有方法也没有属性。

但随后您可以添加一些“即时”,即所谓的Dynamic Properties. 更多在这里

有时,只需要一个属性包即可将键值对放入其中。一种方法是使用 array,但这需要引用所有键。另一种方法是在StdClass的实例上使用动态属性。

希望能帮助到你。

于 2012-09-13T06:48:05.287 回答
0

它返回 stdClass 的对象。如果将对象转换为对象,则不会对其进行修改。如果将任何其他类型的值转换为对象,则会创建 stdClass 内置类的新实例。如果值为 NULL,则新实例将为空。数组转换为具有由键命名的属性和相应值的对象。对于任何其他值,名为 scalar 的成员变量将包含该值。

于 2012-09-13T06:50:50.537 回答