您的位置:首页 > 移动开发 > IOS开发

ios中使用 NSJSONSerialization对 json数据的解析

2015-09-11 10:33 555 查看
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、PerlPython等)。这些特性使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数据。

?
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt
error:(NSError **)error;

这个方法是解析中数据的核心方法,data是JSON数据对象,可以设置一个opt参数,具体用法如下:

?
+ (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对象

-(void) parseJsonData:(NSData *)data

{

//将NSString转化为NSData
拿到的json串需要先转化为NSData类型 才可以进行解析 !!!


NSError *error;

NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

if (json == nil) {

NSLog(@"json parse failed \r\n");

return;

}

NSArray *songArray = [json objectForKey:@"song"];

NSLog(@"song collection: %@\r\n",songArray);

_song = songArray;

self.songIndex = 0;

NSDictionary *song = [songArray objectAtIndex:0];

NSLog(@"song info: %@\t\n",song);

}

Foundation对象转换为json数据

[javascript] view
plaincopy

View Code

NSDictionary *song = [NSDictionary dictionaryWithObjectsAndKeys:@"i can fly",@"title",@"4012",@"length",@"Tom",@"Singer", nil];

if ([NSJSONSerialization isValidJSONObject:song])

{

NSError *error;

///将JSON数据写为NSData数据

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:song options:NSJSONWritingPrettyPrinted error:&error];

NSString *json =[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

NSLog(@"json data:%@",json);

}

将JSON串转化为NSDictionary或NSArray
//将NSString转化为NSData
拿到的json串需要先转化为NSData类型 才可以进行解析 !!!


[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;

}

}

将JSON串与NSArray和NSDictionary的操作进行封装

当然,也有很多时候,我们将这些操作,分别定义在NSObject和NSString的一个分类中

直接贴:

1.将NSString转化为NSArray或者NSDictionary

#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

2.将NSArray或者NSDictionary转化为NSString

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: