JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。所谓的轻量级是与XML文档结构相比,描述项目字符少,所以描述相同的数据所需的字符个数更少,传输速度更高,流量更少
首先对比一下各方法解析JSON文件的效率
json解析速度对比(图片来自网络)
不难看出NSJSONSerialization在效率上完胜JSONKit、SBJSON、TouchJSON、YAJL、NextiveJson。
本文主要介绍NSJSONSerialization和JSONKit两种方法解析JSON文件
NSJSONSerialization解析JSON文件
NSJSONSerialization是iOS5中新增的解析JSON的api,提供了将:
- JSON数据转换为Foundation对象(一般为NSDictionary和NSArray)
- Foundation对象转换为JSON数据(可通过调用isValidJSONObject来判断Foundation对象是否可以转换为JSON数据)
将JSON数据转换为Foundation对象
不废话、上代码
- (void)test1 {
NSString *urlStr = @"http://douban.fm/j/mine/playlist?type=n&h=&channel=0&from=mainsite&r=4941e23d79";
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlStr]];
NSError *error;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
if (error) {
NSLog(@"解析失败--%@", error);
return;
}
NSLog(@"-json: %@",json);
NSArray *array = [json objectForKey:@"song"];
NSLog(@"--song array: %@",array);
NSDictionary *jsonDict = [array objectAtIndex:0];
NSLog(@"-----song jsonDict: %@",jsonDict);
}
结果如图(部分)
屏幕快照 2015-10-22 20.40.53.png
Foundation对象转换为JSON数据
- (void)test2 {
NSDictionary *song = [NSDictionary dictionaryWithObjectsAndKeys:@"gonghonglou",@"name",@"18",@"age",@"man",@"sex", nil];
if ([NSJSONSerialization isValidJSONObject:song])
{
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:song options:NSJSONWritingPrettyPrinted error:&error];
NSString *json =[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"json data:%@",json);
}
}
结果如图
屏幕快照 2015-10-22 20.50.06.png
JSONKit的解析JSON数据
将JSONKit.h、JSONKit.m文件导入工程中,使用时引入头文件:#import "JSONKit.h"
- (void)test3 {
NSString *urlStr = @"http://douban.fm/j/mine/playlist?type=n&h=&channel=0&from=mainsite&r=4941e23d79";
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlStr]];
JSONDecoder *jd = [[JSONDecoder alloc] init];
NSDictionary *jsonDict = [jd objectWithData: data];
NSLog(@"json jsonDict:%@",jsonDict);
}
结果如图
屏幕快照 2015-10-22 20.55.31.png
另:关于JSONKit不支持ARC的解决方法
由于项目已经很久没有更新,仍然使用MRC,因此在使用时需要做如下几处修改:
-
1.把JSONKit设置为不支持arc的模式:
在Build Phases ->Compile Sources 选择JSONKit.m文件 双击,在对话框中添加“-fno-objc-arc”参数(不含引号)点击回车即可 屏幕快照 2015-10-22 21.01.34.png
- 2.此时编译仍会报错:
报错信息: Assignment to Objective-C's isa is deprecated in favor of object_setClass()
解决办法:
(1)修改JSONKit.m文件第680行,改为object_setClass(array, _JKArrayClass);
(2)修改JSONKit.m文件第931行,改为object_setClass(dictionary, _JKDictionaryClass);
搞定!
后记
小白出手,请多指教。
如言有误,还望斧正!
- 转载请保留原文地址:http://www.jianshu.com/p/294c1a16b735
- 有兴趣的读者欢迎关注我的微博:与佳期
网友评论