json_encode/json_decode在PHP中返回stdClass而不是数组

126

观察这个小脚本:

$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对象转化成类(class)?

如果一个数组被 json_encoded 然后 json_decoded,难道不应该得到完全相同的结果吗?

7个回答

151

14
不回答问题——为什么stdClass是默认值。另请参见https://dev59.com/G3A75IYBdhLWcg3wo6le - William Entriken
8
这并没有回答问题,只是提供了一个变通方法。但在我看来,这是一个很糟糕的变通方法。如果你希望将JSON编码的对象解码为对象,将JSON解码的关联数组解码为关联数组,并且自动完成,那该怎么办?使用json_decode()的第二个参数意味着需要某种人为干预。坦率地说,这很烂(是PHP烂,而不是这个答案)。 - JDS
@JDS 如果需要的话,你可以非常容易地封装这些函数并创建自己的函数,透明地将源类型存储在一个JSON键中。 - sivann
2
@JDS,我已经添加了一个回答,实际上回答了“为什么PHP会将JSON对象转换成类”的问题。 - 7ochem
1
不回答问题。 - user2924019
今天偶然发现了这个。不得不说,这是 PHP 给你带来的无尽悲伤的又一个例子。 - Kilves

98
$arrayDecoded = json_decode($arrayEncoded, true);

返回一个数组。


2
这非常有帮助,谢谢 @Kai Chain - 我想最初的问题是在问“为什么”,但这似乎能解决他们的意图。无论如何,对我的情况非常完美。 - ghukill
在这里4年后,它仍然能够完成同样的工作!每个人都应该首先学习基本知识,就像我一样! - KJS

29

回答实际问题:

为什么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对象({} = object),具有一个名为“stuff”的属性和值为“things”,并具有一个名为“things”的属性和其值为字符串数组([] = array)。
JSON(如JavaScript)不知道关联数组,只知道索引数组。因此,当将PHP关联数组进行JSON编码时,这将导致包含此数组作为“对象”的JSON字符串。
现在我们正在使用json_decode($arrayEncoded)再次解码JSON。解码函数不知道此JSON字符串的来源(PHP数组),因此它会解码为未知对象,即在PHP中为stdClass。正如您将看到的,“things”字符串数组将解码为索引PHP数组。
另请参见:

感谢https://www.randomlists.com/things提供的“事物”


3
这是正确答案... 它解答了问题,而其他答案仅提供对未解释的问题的解决方法。谢谢,我一直在困惑,忘记了JSON不支持关联数组! - marcus

7
尽管如上所述,你可以在这里添加第二个参数以表示你想要返回一个数组:
$array = json_decode($json, true);

许多人可能更喜欢对结果进行转换:
$array = (array)json_decode($json);

阅读起来可能更加清晰明了。


6
这里有所不同。如果你编码了一个多维数组或对象,请注意区分。第一个会给你一个包含数组的数组,第二个会给你一个包含对象的数组。 - Hector

2

简而言之:JavaScript不支持关联数组,因此JSON也不支持。

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

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


1
    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解码为数组,那么在这种情况下会丢失信息。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接