json_encode / json_decode-在PHP中返回stdClass而不是Array


108

观察这个小脚本:

$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产生完全相同的结果?

Answers:


145

采取在的第二个参数仔细看看json_decode($json, $assoc, $depth)https://secure.php.net/json_decode


7
没有回答问题-为什么stdClass是默认设置。另请参见stackoverflow.com/questions/3193765/...
威廉Entriken

7
这确实不能回答问题,它只是提供了一种解决方法。但是糟糕的解决方法,IMO。如果您希望自动将json编码的对象解码为对象,而将json解码的关联数组自动解码为关联数组,该怎么办?对json_decode()使用第二个参数意味着某种人工干预。坦白说,这很令人讨厌(PHP,不是这个答案)
JDS

@JDS,您可以非常轻松地包装这些函数并创建自己的函数,如果需要,可以将源类型透明地存储在json密钥中。
sivann 2014年

2
@JDS我添加了一个答案,该答案实际上回答了“ PHP为什么将JSON对象转换为类?”的问题。
7ochem

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

给你一个数组。


2
这太有用了,谢谢@Kai Chain-我想最初的问题是问“为什么”,但这似乎可以达到他们的预期。无论如何,最适合我的情况。
ghukill

并在这里工作了4年!像我一样,每个人都应该首先学习的基本知识!
KJS

20

要回答实际问题:

为什么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)只知道索引数组,而不知道关联数组。因此,当用JSON编码PHP关联数组时,这将导致包含该数组作为“对象”的JSON字符串。

现在,我们再次使用解码JSON json_decode($arrayEncoded)。解码功能不知道此JSON字符串的来源(PHP数组),因此它正在解码为stdClassPHP中的未知对象。正如您将看到的,字符串的“事物”数组将解码为索引的PHP数组。

另请参阅:


感谢https://www.randomlists.com/things的“东西”


2
这是正确的答案...它回答了问题,而其他答案则给出了无法解释的问题的解决方法。谢谢,我一直在兜圈子,忘记了JSON不支持关联数组!
marcus

5

尽管如前所述,您可以在此处添加第二个参数来指示您希望返回数组:

$array = json_decode($json, true);

许多人可能更喜欢强制转换结果:

$array = (array)json_decode($json);

阅读起来可能更清晰。


4
有不同的。请注意,您是否已编码多维数组或对象。第一个给您数组数组,第二个给您对象数组。
Hector

2

tl; dr: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解码为数组,在这种情况下信息将会丢失。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.