php - json_decode 到数组或对象

标签 php json

最近我遇到一个问题,有人问我,为什么我把 json_decode 的输出变成一个 assoc 数组。

对我来说,使用 assoc 数组比使用 stdClasses 更容易,而且在我解码 json 字符串后,已经有很多支持数据处理的 array_* 函数。

经过简短的性能测试后发现,转换为 assoc 数组比转换为 stdClass 快大约 20%。

不过,默认行为是$assoc = false。所以我想知道,在处理 json 数据时使用 stdClasses 有什么好处。 是否有任何 json 类型不能在 assoc 数组中表示,但在 stdClasses 中?

最佳答案

这可能会因为基于意见而结束,但对我来说,我通常会解码为对用例最有意义的任何数据结构。

例如,假设 JSON 描述了像书这样的单个项目并且看起来像这样:

{
    "title": "Cool Book",
    "author": "Amazing Author",
    "publisher": "Evil Corporation",
    ...
}

对我来说,这是一个对象,因为它是具有不同属性的单个项目。我可能希望在我的后续代码中将其视为一个对象,因此我会将其解码为一个对象。

现在,如果 JSON 包含可能表示字典、映射、哈希表等的数据类型,那么所有键值对在本质上都是相似的项目,只是具有不同的查找和映射值,我可能会考虑解码为关联数组。也许一个很好的例子就是国家代码到国家名称的映射,如下所示:

{
    "AF": "Afghanistan",
    "AX": "Aland Islands",
    "AL": "Albania",
    "DZ": "Algeria",
    ...
}

我可能倾向于将其解码为关联数组,因为我不需要此信息的任何面向对象表示,因为我只是将其用于键值查找。

为了回答您关于可以用 JSON 表示的其他数据结构的问题,正式地,JSON 只支持两种数据结构 - 对象和数字索引数组。这是因为序列化格式基于 javascript 的根源,例如,其中不存在“开箱即用”关联数组的概念。

然而,您会发现许多跨语言的 JSON 编码/解码库确实添加了对其他数据结构或类型的支持,通常添加了围绕原始数据类型的处理行为,但除非您完全理解数据,否则我不会依赖它将要传递的结构以及它们将如何在可能传递数据的所有应用程序中编码/解码。

例如,PHP 提供了对某些原语的支持,如 json_encode() 文档中的注释所示:

Note: Like the reference JSON encoder, json_encode() will generate JSON that is a simple value (that is, neither an object nor an array) if given a string, integer, float or boolean as an input value. While most decoders will accept these values as valid JSON, some may not, as the specification is ambiguous on this point. To summarise, always test that your JSON decoder can handle the output you generate from json_encode().

最后,关于性能,如果您在应用程序开发中最关心的是优化执行时间、内存利用率等性能,并且您有理由相信可以取得相对可观的 yield 通过优化 JSON 反序列化(以及后续的数据访问)逻辑,您最终应该使用代表性数据测试您的应用程序,看看什么最适合您。我的猜测是,这将是针对大多数应用程序的微优化。

关于php - json_decode 到数组或对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33680174/

相关文章:

php - 在 JSON 的响应对象上调用 Ajax

php - block 和模板如何在 Magento 中工作

json - 在 Hive 中映射 JSON,其中嵌套字段具有下划线

json - API 可以不理解我的属性类型吗?

php - Mysqli INSERT 未显示在数据库中且没有错误

php - 列出 channel 中已安装的包

简单连接到 MySQL 时 PHP 超时 - 在 win2k8 64 位 IIS 7/FastCGI php 上 - 新安装

ios - Json 数据未正确反射(reflect)在 tableView 中

java - 为什么这个 REST 服务没有返回,而另一个则返回?

javascript - 为什么我得到 : Uncaught ReferenceError: response is not defined