有了从网络获取数据的能力,今天就是练习一下网络传送的常见数据格式-JSON,当然XML是主流,但我自己比较喜欢JSON,而且大致看了一下XML的解析,objcec-c有专门的类做此工作,也就看看理论就罢了。今天的代码只练习JSON,今天的参考代码仍然是《iOS 5 Programming CookBook》作者Vandad Nahavandipoor。
预计结果如下:
上面有个小知识点:在强制转换前可以判断对象是属于那个类的,这一点真很有用,我记得之前有个网页的Object-c教程,就利用这一点将面向对象的多态特点应用到程序中,恩,我还得学习,今天比较简单就到这,明天搞定音频和视频框架的使用,准备准备简历,明天去人才市场看看去~~
首先复习下JSON的格式:整个数据是包装在{和}之间,内容是键:值对,键值对之间用“,”隔开,值也可以是数组,包装在[]之间,数据之间也是用“,”隔开,我曾经再学ExtJs的时候学习了下JSON,JSON还能组成比较复杂的数据结构,但不是今天关心的,今天主要是标准的JSON格式数据的封装与解析。
先来封装,一说键值对,在object-c语言中绝对是首先联想到NSDictionary类,如果是JAVA的话我想到的是Map,嘿嘿,好久没碰JAVA了,居然还是我大学的主修呢~~JSON数据之所以比XML好封装就是应为NSData类直接有方法将NSDictionary实例转换成JSON对象,前提是,特别重要,数据字典中的值必须是NSString实例或NSArray实例或NSNumber实例,NSArray我想就是对应JSON可以存储的数组对象,我想里面也必须是NSString和NSNumber实例吧~
贴封装代码:(内容我小改了一下)
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
[dictionary setValue:@"Beleege" forKey:@"first name"];
[dictionary setValue:@"Zhang" forKey:@"last name"];
[dictionary setValue:[NSNumber numberWithUnsignedInt:23] forKey:@"age"];
NSArray *array = [[NSArray alloc] initWithObjects:@"Wang Meng",
@"Bai Mo",
@"PP",nil];
[dictionary setValue:array forKey:@"firends"];
NSError *err = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&err];
if (jsonData.length > 0 && err == nil) {
NSLog(@"Success seralized dictionary into data.");
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"json string = %@", jsonString);
} else if (jsonData.length == 0 && err == nil) {
NSLog(@"NO data returned after serialized");
} else if (err != nil) {
NSLog(@"An err happened = %@", err);
}
预计结果如下:
Success seralized dictionary into data.
json string = {
"age" : 23,
"last name" : "Zhang",
"firends" : [
"Wang Meng",
"Bai Mo",
"PP"
],
"first name" : "Beleege"
}
再贴解析代码:
id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:&err];
if (jsonObject != nil && err == nil) {
NSLog(@"Successfully deseriazed...");
if ([jsonObject isKindOfClass:[NSDictionary class]]) {
NSDictionary *deserializedDictionary = (NSDictionary *)jsonObject;
NSLog(@"Deserialized JSON Dictionary = %@", deserializedDictionary);
} else if ([jsonObject isKindOfClass:[NSArray class]]) {
NSArray *deserializedArray = (NSArray *)jsonObject;
NSLog(@"Deserialized JSON Array = %@", deserializedArray);
}
} else if(err != nil) {
NSLog(@"An err happened while deserializing JSON Data.");
}
上面有个小知识点:在强制转换前可以判断对象是属于那个类的,这一点真很有用,我记得之前有个网页的Object-c教程,就利用这一点将面向对象的多态特点应用到程序中,恩,我还得学习,今天比较简单就到这,明天搞定音频和视频框架的使用,准备准备简历,明天去人才市场看看去~~