json_decode到数组或对象

Phi*_*ipp 6 php json

我发现了一个问题,有人问我,为什么我把输出json_decode变成一个关联数组.

对我来说,使用关联数组比使用stdClasses更容易,并且在解码json字符串之后,已经存在许多支持数据处理的array_*函数.

经过短暂的性能测试后,转换为assoc数组的转换速度比转换为stdClass快约20%.

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

Mik*_*ant 5

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

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

{
    "title": "Cool Book",
    "author": "Amazing Author",
    "publisher": "Evil Corporation",
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

{
    "AF": "Afghanistan",
    "AX": "Aland Islands",
    "AL": "Albania",
    "DZ": "Algeria",
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

注意:与参考 JSON 编码器一样,如果给定字符串、整数、浮点数或布尔值作为输入值,json_encode() 将生成一个简单值(即既不是对象也不是数组)的 JSON。虽然大多数解码器会接受这些值作为有效的 JSON,但有些可能不会,因为规范在这一点上是模棱两可的。总而言之,始终测试您的 JSON 解码器是否可以处理您从 json_encode() 生成的输出。

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