NSJSONSerialization 与基于流的解析器

Posted

技术标签:

【中文标题】NSJSONSerialization 与基于流的解析器【英文标题】:NSJSONSerialization vs stream based parser 【发布时间】:2013-07-04 18:46:32 【问题描述】:

我的 iPad 应用程序需要解析一个 10 MB 的 JSON 文件并将其内容保存在 Core Data 中。

考虑到大文件大小和内存使用情况,您会推荐使用NSJSONSerialization,还是选择基于流的 JSON 解析器(在这种情况下,您会推荐哪种基于流的解析器)?顺便说一句:该文件是由另一个 ios 应用使用NSJSONSerialization 创建的。

谢谢!

【问题讨论】:

如果“基于流”是指类似于某些 XML 解析器的解析器,在这些解析器中,您“询问”特定数据位并“即时”提取,而不是解析整个文件并返回结果数据在一个“块”中,这种类型的 JSON 解析器很少。这在很大程度上是因为解析后的 JSON 的内部表示比 XML 的典型内部表示更紧凑,因此一次解析所有内容更实用。 (另外,您无法像使用 XML 那样保证 JSON 对象中的项目顺序。) 【参考方案1】:

我推荐两者,因为NSJSONSerialization 有方法JSONObjectWithStream:options:error:


您可以改用this JSON parsing framework。

【讨论】:

但是从解析器构建的字典结构会在解析过程完成后立即分配 10 MB 的 RAM?这不会导致 iOS 内存警告吗? 这取决于它是什么以及它的格式。 10MB 的 JSON 文本不一定等于 10MB 的内存数据。如果它的内存很大,那么你不想在任何时间点加载(所以你不想解析)整个东西。 一般来说,JSON 文件的解析表示会比源文件大一点(可能是 3-5 倍)。 JSON 中的“糖”很少,JSON 中的所有字符串都需要在解析器输出中表示。字符串将被扩展为 2 字节或 4 字节的表示形式,此外它们还有对象开销,以及管理语言数组和字典的开销。

以上是关于NSJSONSerialization 与基于流的解析器的主要内容,如果未能解决你的问题,请参考以下文章

NSDictionary 到 JSON 与 NSJSONSerialization 问题

NSJSONSerialization 与 C# Rest 服务

NSJSONSerialization 不解析这个 JSON

取消 NSJSONSerialization - 键入时搜索,请求重叠

NSJSONSerialization JSONObjectWithData:options:error: 编码问题

基于流的颤振小吃店展示