标签:
在 Cocoa 下处理 JSON 数据非常方便,核心对象便是 NSJSONSerialization 这个类,它可以完成 JSON 数据与 Foundation 对象之间的相互转换。将 JSON 数据转为 Foundation 对象,使用 JSONObjectWithData。将 Foundation 对象转为 JSON 数据,使用 dataWithJSONObject。这个类也支持流的输入输出。
转换成 JSON 的对象必须具有如下属性:
所幸 JSON 数据类型基本上都是字符串和整数。对于整数值和布尔值,Cocoa 都是以 NSNumber 封装的,因此 JSON 中的布尔值,需要用 NSNumber 的 boolValue 获取。
比如,简化代码:
NSDictionary *jsonDict = @{@"name":@"catshit", @"id":@1, @"extras":@{@"color":@"black", @"active": @YES, @"option":[NSNull null]}};
NSData *data = [NSJSONSerialization dataWithJSONObject:jsonDict options:0 error:nil];
NSLog(@"%@", [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
输出 JSON 字符串:
{"name":"catshit","id":1,"extras":{"color":"black","option":null,"active":true}}
将 Foundation 对象转为 JSON 数据时,可以预先用 isValidJSONObject 判断能否转换成功。
解析通过 JSONObjectWithData:
NSString *jsonString = @"{\"name\":\"catshit\", \"id\":1, \"extras\":{\"color\":\"black\", \"active\": true, \"option\":null}}"; NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];
NSLog(@"name = %@", [jsonDict valueForKey:@"name"]);
JSONObjectWithData 其实是返回一个 id 型,因为顶层有可能是 NSArray 或者 NSDictionary,对这个例子来说,顶层是字典。
借助于 KVC,访问嵌套数据也十分方便,比如想直接访问 extras 下的 active 是否为真,可以这样:
NSNumber *active = [jsonDict valueForKeyPath:@"extras.active"];
if([active boolValue]) { ... }
是不是很简单? NSJSONSerialization 在 Cocoa 和 Cocoa Touch 下都存在,是处理 JSON 很小巧方便的一个类。
标签:
原文地址:http://www.cnblogs.com/reviver/p/cocoa-json.html