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