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、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数据。
?
+ (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
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数据。
?
error:(NSError **)error;
这个方法是解析中数据的核心方法,data是JSON数据对象,可以设置一个opt参数,具体用法如下:
?
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
相关文章推荐
- iOS标准时间与时间戳相互转换
- iOS中百度地图的使用
- ios7 左右searchbar在设置cancelButton的title属性
- iOS 视图放在最上面
- IOS从零到能找到工作 第一课---- Xcode简单介绍
- 如何清除iOS模拟器的数据
- iOS 统计打点那些事
- [ios]ios语音识别
- [ios]ios tts的使用
- 正则表达式在IOS中的应用及IOS中三种正则表达式的使用与比较
- 苹果为公测用户发布第一个 iOS 9.1 测试版
- iOS:Button.titleLabel.text
- 在iOS中9和OSX10.11配置应用程序传输安全
- 举例讲解iOS中延迟加载和上拉刷新/下拉加载的实现
- 全面了解 iOS 静态库开发
- 源码推荐(9.11):带指示牌晃动效果的进度条,ios涂鸦支持贝塞尔曲线
- iOS Block之皮毛
- iOS 生成静态库.a文件
- licode的ios最新版本的接入
- iOS 9学习系列:打通 iOS 9 的通用链接(Universal Links)