繁体   English   中英

json_decode到数组或对象

[英]json_decode to array or to object

Latly我遇到了一个问题,有人问我,为什么我将json_decode的输出变成一个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包含可能代表字典,映射,散列表等结构的数据类型,其中所有键值对本质上是相似的项目,只是具有不同的查找和映射值,I可能会考虑解码为关联数组。 也许一个很好的例子是国家/地区名称映射的国家/地区代码,如下所示:

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

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

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

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

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

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

最后,关于性能,如果你达到了应用程序开发的重点,那么首要关注的是优化执行时间,内存利用率等性能,你有理由相信通过优化它可以获得相对可观的收益。 JSON反序列化(以及后续的数据访问)逻辑,那么您应该最终使用代表性数据测试您的应用程序,看看什么最适合您。 我的猜测是,对于大多数应用来说,这将是微优化的。

我认为原因是,JSON是“JavaScript Object Notation”,因此人们期待一个对象。 如果你看一下json.org ,一个对象被定义为一组无序的名称/值对,一个数组用于有序的值集合,就像人们在javascript中习惯它一样。 这也可以在RFC 4627中找到:

术语“对象”和“数组”来自JavaScript的约定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM