json_decode到数组或对象

时间:2015-11-12 19:54:39

标签: php json

Latly我遇到了一个问题,有人问我,为什么我将json_decode的输出变成一个关联数组。

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

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

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

2 个答案:

答案 0 :(得分:3)

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

例如,假设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()文档中的本说明所示:

  

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

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

答案 1 :(得分:0)

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

中找到
  

术语“对象”和“数组”来自JavaScript的惯例。