FXJSON 是 iOS 和 Mac OS 上的一个轻量级、相对快速的 JSON 解析器。它不是最快的,但是足够快(请查看下面的性能基准测试),并且它有一些出色的功能
注意:'支持'表示库已经与该版本进行了测试。'兼容'表示该库应该在该 iOS 版本上运行(即它不依赖于任何不可用的 SDK 功能),但它不再进行兼容性测试,可能需要调整或修复错误才能正确运行。
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数据并返回对象。
- (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_VALUES
、FXJSON_OMIT_NULL_ARRAY_VALUES
和FXJSON_USE_NSJON_IF_AVAILABLE
选项的情况下进行的。自己在以下基准应用程序中查看:[基准应用链接]