FXJSON 1.1

FXJSON 1.1

测试已测试
Lang语言 Obj-CObjective C
许可证 zlib
发布最新版本2014年12月

未指定 维护。



FXJSON 1.1

  • 作者
  • Nick Lockwood

用途

FXJSON 是 iOS 和 Mac OS 上的一个轻量级、相对快速的 JSON 解析器。它不是最快的,但是足够快(请查看下面的性能基准测试),并且它有一些出色的功能

  • 可选的 SAX-style 解析,适用于大文件或顺序重要的场景
  • 完全 ARC 兼容(也适用于非 ARC)
  • 简单 - 只有一个类,代码易于理解
  • 没有编译器警告
  • 可选地从字典或数组中删除 null 值
  • 可选地在 iOS 5 和更高版本上使用 NSJSONSerialization
  • 可以处理数组/对象中的悬空逗号

支持的 iOS & SDK 版本

  • 支持的构建目标 - iOS 6.1 / Mac OS 10.8 (Xcode 4.6, Apple LLVM 编译器 4.2)
  • 最早支持的部署目标 - iOS 5.0 / Mac OS 10.7
  • 最早兼容的部署目标 - iOS 4.3 / Mac OS 10.6

注意:'支持'表示库已经与该版本进行了测试。'兼容'表示该库应该在该 iOS 版本上运行(即它不依赖于任何不可用的 SDK 功能),但它不再进行兼容性测试,可能需要调整或修复错误才能正确运行。

ARC 兼容性

FXJSON 通过条件编译自动支持 ARC 和非 ARC 项目。不需要从 ARC 验证过程排除 FXJSON 文件,也不需要使用 ARC 转换工具转换 FXJSON。

安装

要使用 FXJSON,只需将类文件拖到您的项目中。FXJSON 方法是静态的,因此无需创建 FXJSON 类的实例。

配置

FXJSON 有以下配置常量。您可以根据需要将其设置为编译设置中的预处理器宏,以覆盖默认值

FXJSON_OMIT_NULL_OBJECT_VALUES

此选项将禁止为 JSON {...} 对象中的 null 值生成 NSNull 对象。这通常很理想,因为当接收 NSNull 而期望其它对象类型时程序可能会崩溃,而通常没有值(nil)可以优雅地处理。此选项启用时,数组中的 null 值仍然会输出为 NSNull,因为删除这些值会影响数组索引。默认为 YES。在使用基于委托的枚举时不受影响。

FXJSON_OMIT_NULL_ARRAY_VALUES

此选项将禁用为JSON数组中的null值生成NSNull对象。这通常是希望的,因为当程序接收到NSNull却发现应该接收其他对象类型时可能会崩溃。默认为NO,因为可能会搞乱预期的数组索引或项目计数。在基于代理的枚举使用时不受影响。

FXJSON_USE_NSJSON_IF_AVAILABLE

此选项会导致FXJSON在iOS5及以上版本上使用NSJSONSerialization类。这是希望的,因为NSJSONSerialization类在大多数基准测试中比FXJSON快。在基于代理的枚举使用时不受影响。

方法

FXJSON有以下静态方法

+ (void)enumerateJSONData:(NSData *)data withDelegate:(id<FXJSONDelegate>)delegate;

使用SAX风格的解析器解析JSON数据,其中值是通过代理而不是作为分层对象返回。这种方法的优点是,可以不消耗大量内存(因为不需要将整个对象图存储在内存中)来解析非常大的文件,并且JSON对象中的键(即字典)保证以它们在文件中出现的顺序返回(NSDictionary中键的顺序是任意的且未记录)。代理方法同步调用,但是方法是线程安全的,因此可以在后台线程上执行解析以避免阻塞UI。以下详细说明了FXJSONDelegate方法。

+ (id)objectWithJSONEncodedString:(NSString *)string;

将字符串解析为JSON数据并返回对象。请注意,这与使用`objectWithJSONData`不如高效,因为字符串必须首先从UTF16转换为UTF8字节数据后才能解析。

+ (id)objectWithJSONData:(NSData *)data;

将UTF8格式的字符串解析为JSON数据并返回对象。

FXJSONDelegate方法

- (void)didStartJSONParsing;

解析开始前立即调用此方法。

- (void)didStartJSONArray;

解析器遇到JSON数组开头时调用此方法。

- (void)didStartJSONObject;

解析器遇到JSON对象(即字典)开头时调用此方法。

- (void)didFindJSONKey:(NSString *)key;

解析器遇到JSON对象内的键时调用此方法。

- (void)didFindJSONValue:(id)value;

解析器遇到JSON对象或数组(或文件的根对象)内的值时调用此方法。请注意,这只针对非集合类型值。当遇响JSON对象或数组时,将调用`didStart...`方法。

- (void)didEndJSONObject;

解析器遇到JSON对象结尾时调用此方法。

- (void)didEndJSONArray;

解析器遇到JSON数组结尾时调用此方法。

- (void)didEndJSONParsing;

达到文档末尾时调用此方法。在遇到错误时,可能不会调用此方法。

注意事项

FXJSON始终返回可变容器对象(NSMutableArray或NSDictionary),因此可以在返回数据后高效地操作数据。

FXJSON始终返回不可变字符串。

FXJSON接受任何根对象类型,只要它是有效的JSON即可,因此返回的对象可以是NSMutableDictionary、NSMutableArray、NSString、NSNumber或NSNull。

性能

FXJSON不是最快的JSON解析器,但也不是最慢的。在统计数据中,它在最流行的6个第三方JSON解析器中排名第4。

值得注意的是,由于FXJSON自动默认在iOS5上使用NSJSONSerialization,如果启用此选项,它实际上会排名第二(因为它默认启用)。

JSONKit                     10.942 ms
NextiveJson                 37.001 ms
YAJL                        55.896 ms
FXJSON                      65.618 ms
SBJson                      78.108 ms
TouchJSON                  113.995 ms

NSJSONSerialization         32.044 ms

在iPhone 4S上的iOS 5.1上进行的比较。测试是在禁用FXJSON_OMIT_NULL_OBJECT_VALUESFXJSON_OMIT_NULL_ARRAY_VALUESFXJSON_USE_NSJON_IF_AVAILABLE选项的情况下进行的。自己在以下基准应用程序中查看:[基准应用链接]

https://github.com/nicklockwood/json-benchmarks