为什么PHP函数“json_decode”返回一个对象?

时间:2012-09-13 06:31:26

标签: php arrays object json

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

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

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

4 个答案:

答案 0 :(得分:8)

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

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

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

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

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

但请注意,PHP数组 与JSON数组和对象相同。 PHP允许您混合命名和编号的数组键。这不能很好地映射到JSON,所以如果你使用PHP数组来使用JSON,你必须要小心它。如果您正在使用PHP对象进行JSON工作,那么您的功能就不会出现这种不匹配。

答案 1 :(得分:2)

好的,所以你似乎已经知道了这一点:

默认情况下,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

答案 2 :(得分:0)

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

但是你可以添加一些“动态”,即所谓的Dynamic Properties。更多here

  

有时,所有必要的是将键值对投入的属性包。 一种方法是使用数组,但这需要引用所有键。 另一种方法是在 StdClass 的实例上使用动态属性

希望它有所帮助。

答案 3 :(得分:0)

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