ios5中apple增加了解析JSON的api——NSJSONSerialization。通过该类,我们可以完成JSON数据与NSDictionary和NSArray之间的转化。网上已经有人做过测试,NSJSONSerialization在效率上完胜SBJSON、TouchJSON、YAJL、JSONKit、NextiveJson。
NSJSONSerialization提供了将JSON数据转换为Foundation对象(一般都是NSDictionary和NSArray)和Foundation对象转换为JSON数据(可以通过调用isValidJSONObject来判断Foundation对象是否可以转换为JSON数据)。
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(网络传输速率)。
iOS中从服务器获得json数据是需要解析转换为Foundation对象(一般都是NSDictionary和NSArray)才能使用,同样的Foundation对象也是可以转换为json数据的,这时候使用NSJSONSerialization就非常的方便了。
官方为我们提供的解析JSON数据的类NSJSONSerialization的几个方法:
+ (BOOL)isValidJSONObject:(id)obj;
判断一个数据对象是否可以转化为JSON数据
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
将JSON数据写为NSData数据,其中opt参数的枚举如下,这个参数可以设置,也可以不设置,如果设置,则会输出视觉美观的JSON数据,否则输出紧凑的JSON数据。
1
2
3
|
typedef
NS_OPTIONS(NSUInteger, NSJSONWritingOptions) {
NSJSONWritingPrettyPrinted = (1UL << 0)
}
|
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
这个方法是解析中数据的核心方法,data是JSON数据对象,可以设置一个opt参数,具体用法如下:
1
2
3
4
5
6
7
8
|
typedef
NS_OPTIONS(NSUInteger, NSJSONReadingOptions) {
//将解析的数组和字典设置为可变对象
NSJSONReadingMutableContainers = (1UL << 0),
//将解析数据的子节点创建为可变字符串对象
NSJSONReadingMutableLeaves = (1UL << 1),
//允许解析对象的最上层不是字典或者数组
NSJSONReadingAllowFragments = (1UL << 2)
}
|
+ (NSInteger)writeJSONObject:(id)obj toStream:(NSOutputStream *)stream options:(NSJSONWritingOptions)opt error:(NSError **)error;
将JSON数据写入到输出流,返回的是写入流的字节数
+ (id)JSONObjectWithStream:(NSInputStream *)stream options:(NSJSONReadingOptions)opt error:(NSError **)error;
从输入流读取JSON数据
json数据转换为Foundation对象
Foundation对象转换为json数据
[jsonString dataUsingEncoding:NSASCIIStringEncoding];
// 将JSON串转化为字典或者数组
- (id)toArrayOrNSDictionary:(NSData *)jsonData{
NSError *error = nil;
id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData
options:NSJSONReadingAllowFragments
error:&error];
if (jsonObject != nil && error == nil){
return jsonObject;
}else{
// 解析错误
return nil;
}
}
#import "NSString+JSONCategories.h"
@implementation NSString(JSONCategories)
-(id)JSONValue;
{
NSData* data = [self dataUsingEncoding:NSUTF8StringEncoding];
__autoreleasing NSError* error = nil;
id result = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
if (error != nil) return nil;
return result;
}
@end
#import "NSObject+JSONCategories.h"
@implementation NSObject (JSONCategories)
-(NSData*)JSONString;
{
NSError* error = nil;
id result = [NSJSONSerialization dataWithJSONObject:self
options:kNilOptions error:&error];
if (error != nil) return nil;
return result;
}
@end