开发笔记3-JSON数据的创建与读取

来源:互联网 发布:淘宝代购only哪家靠谱 编辑:程序博客网 时间:2024/05/17 22:03
有了从网络获取数据的能力,今天就是练习一下网络传送的常见数据格式-JSON,当然XML是主流,但我自己比较喜欢JSON,而且大致看了一下XML的解析,objcec-c有专门的类做此工作,也就看看理论就罢了。今天的代码只练习JSON,今天的参考代码仍然是《iOS 5 Programming CookBook》作者Vandad Nahavandipoor。

首先复习下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教程,就利用这一点将面向对象的多态特点应用到程序中,恩,我还得学习,今天比较简单就到这,明天搞定音频和视频框架的使用,准备准备简历,明天去人才市场看看去~~

原创粉丝点击