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

Posted

技术标签:

【中文标题】json_encode/json_decode - 在 PHP 中返回 stdClass 而不是 Array【英文标题】:json_encode/json_decode - returns stdClass instead of Array in PHP 【发布时间】:2011-01-17 22:14:30 【问题描述】:

观察这个小脚本:

$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 的数组不应该产生完全相同的结果吗?

【问题讨论】:

【参考方案1】:

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

【讨论】:

不回答问题——为什么 stdClass 是默认值。另请参阅***.com/questions/3193765/… 这真的没有回答问题,它只是提供了一种解决方法。但是一个糟糕的解决方法,IMO。如果您希望将 json 编码的对象解码为对象,并将 json 解码的关联数组自动解码为关联数组,该怎么办?使用 json_decode() 的第二个参数意味着某种人工干预。坦率地说,这很糟糕(PHP,而不是这个答案) @JDS 我添加了一个答案,实际上回答了“为什么 PHP 将 JSON 对象变成一个类?”的问题 不回答问题。【参考方案2】:
$arrayDecoded = json_decode($arrayEncoded, true);

给你一个数组。

【讨论】:

这非常有用,谢谢@Kai Chain - 我想最初的问题是问“为什么”,但这似乎达到了他们的意图。无论如何,非常适合我的情况。 在这里 4 年后做同样的工作!像我一样,每个人都应该首先学习的基础知识!【参考方案3】:

回答实际问题:

为什么 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 ( = object),其属性“stuff”的值为“things”,属性“things”的值为数组字符串 ([] = 数组)。

JSON(作为 JavaScript)不知道关联数组,只知道索引数组。因此,当 JSON 编码 PHP 关联数组时,这将导致包含该数组作为“对象”的 JSON 字符串。

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

另见:

RFC 4627 - The application/json Media Type for JavaScript Object RFC 7159 - The JavaScript Object Notation (JSON) Data Interchang PHP Manual - Arrays

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

【讨论】:

这是正确的答案......它回答了问题,而其他的则为无法解释的问题提供了解决方法。谢谢,我在圈子里忘记了 JSON 不支持关联数组!【参考方案4】:

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

$array = json_decode($json, true);

许多人可能更喜欢投射结果:

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

阅读起来可能更清楚。

【讨论】:

有不同的。请注意您是否对多维数组或对象进行了编码。第一个为您提供数组数组,第二个为您提供对象数组。【参考方案5】:

tl;dr:JavaScript 不支持关联数组,因此 JSON 也不支持。

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

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

【讨论】:

【参考方案6】:
    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解码成数组,这种情况下信息会丢失。

【讨论】:

【参考方案7】:

还有一个很好的 PHP 4 json 编码/解码库(甚至 PHP 5 反向兼容)写在这篇博文中:Using json_encode() and json_decode() in PHP4 (Jun 2009)。

具体代码由 Michal Migurski 和 Matt Knapp 编写:

JSON-PHP / january 2005 代码:http://mike.teczno.com/JSON/JSON.phps 梨子求婚:http://pear.php.net/pepr/pepr-proposal-show.php?id=198 梨包:http://pear.php.net/package/Services_JSON

【讨论】:

以上是关于json_encode/json_decode - 在 PHP 中返回 stdClass 而不是 Array的主要内容,如果未能解决你的问题,请参考以下文章

php model与json_encode/json_decode

原来 php 中的 json_encode() 只支持utf-8.不支持gbk啊

php 编码和解码的函数

unserialize3

PHP反序列化总结

PHP JSON 或数组到 XML