1.0 JSON解析
1.1 JSON簡單介紹
答:
(1)JSON是一種輕量級的數(shù)據(jù)格式莺治,一般用于數(shù)據(jù)交互
(2)服務(wù)器返回給客戶端的數(shù)據(jù),一般都是JSON格式或者XML格式(文件下載除外)
002 相關(guān)說明
(1)JSON的格式很像OC中的字典和數(shù)組
{"name" : "jack", "age" : 10}
{"names" : ["jack", "rose", "jim"]}
(2)標(biāo)準(zhǔn)JSON格式: key必須是雙引號
要想從JSON中挖掘出具體數(shù)據(jù)熄赡,得對JSON進行解析
JSON 轉(zhuǎn)換為 OC數(shù)據(jù)類型
003 JSON解析方案
a.第三方框架 JSONKit\SBJSON\TouchJSON
b.蘋果原生(NSJSONSerialization)
1.3 JSON解析相關(guān)代碼
(1)json數(shù)據(jù)->OC對象
//把json數(shù)據(jù)轉(zhuǎn)換為OC對象-(void)jsonToOC
{//1. 確定url路徑NSURL*url = [NSURLURLWithString:@"http://120.25.226.186:32812/login?username=33&pwd=33&type=JSON"];//2.創(chuàng)建一個請求對象NSURLRequest*request = [NSURLRequestrequestWithURL:url];//3.使用NSURLSession發(fā)送一個異步請求[NSURLConnectionsendAsynchronousRequest:request queue:[NSOperationQueuemainQueue] completionHandler:^(NSURLResponse* _Nullable response,NSData* _Nullable data,NSError* _Nullable connectionError) {//4.當(dāng)接收到服務(wù)器響應(yīng)的數(shù)據(jù)后,解析數(shù)據(jù)(JSON--->OC)/*
第一個參數(shù):要解析的JSON數(shù)據(jù),是NSData類型也就是二進制數(shù)據(jù)
第二個參數(shù): 解析JSON的可選配置參數(shù)
NSJSONReadingMutableContainers 解析出來的字典和數(shù)組是可變的
NSJSONReadingMutableLeaves 解析出來的對象中的字符串是可變的? iOS7以后有問題
NSJSONReadingAllowFragments 被解析的JSON數(shù)據(jù)如果既不是字典也不是數(shù)組, 那么就必須使用這個
*/NSDictionary*dict = [NSJSONSerializationJSONObjectWithData:data options:kNilOptions error:nil];NSLog(@"%@",dict);
}];
}
(2)OC對象->JSON對象
//1.要轉(zhuǎn)換成JSON數(shù)據(jù)的OC對象*這里是一個字典NSDictionary*dictM = @{@"hwm":@"是壞蛋",@"age":@100,@"height":@1.72};//2.OC->JSON/*
注意:可以通過+ (BOOL)isValidJSONObject:(id)obj;方法判斷當(dāng)前OC對象能否轉(zhuǎn)換為JSON數(shù)據(jù)
具體限制:
1.obj 是NSArray 或 NSDictionay 以及他們派生出來的子類
2.obj 包含的所有對象是NSString,NSNumber,NSArray,NSDictionary 或NSNull
3.字典中所有的key必須是NSString類型的
4.NSNumber的對象不能是NaN或無窮大
*//*
第一個參數(shù):要轉(zhuǎn)換成JSON數(shù)據(jù)的OC對象挤茄,這里為一個字典
第二個參數(shù):NSJSONWritingPrettyPrinted對轉(zhuǎn)換之后的JSON對象進行排版山害,無意義
*/NSData*data = [NSJSONSerializationdataWithJSONObject:dict options:kNilOptions error:nil];// OC對象 -> JSON數(shù)據(jù) [數(shù)據(jù)傳輸只能以進制流方式傳輸,所以傳輸給我們的是進制流,但是本質(zhì)是JSON數(shù)據(jù)NSLog(@"%@", data);NSLog(@"%@", [[NSStringalloc] initWithData:data encoding:NSUTF8StringEncoding]);//3.打印查看Data是否有值/*
第一個參數(shù):要轉(zhuǎn)換為STring的二進制數(shù)據(jù)
第二個參數(shù):編碼方式纠俭,通常采用NSUTF8StringEncoding
*/NSLog(@"%@", data);NSLog(@"%@", [[NSStringalloc] initWithData:data encoding:NSUTF8StringEncoding]);
(3)OC對象和JSON數(shù)據(jù)格式之間的一一對應(yīng)關(guān)系
//OC對象和JSON數(shù)據(jù)之間的一一對應(yīng)關(guān)系-(void)oCWithJSON
{//JSON的各種數(shù)據(jù)格式//NSString *test = @"\"windy聽話\"";//NSString *test = @"true";NSString*test =@"{\"name\":\"windy聽話\"}";//把JSON數(shù)據(jù)->OC對象,以便查看他們之間的一一對應(yīng)關(guān)系//注意點:如何被解析的JSON數(shù)據(jù)如果既不是字典也不是數(shù)組(比如是NSString), 那么就必須使用這NSJSONReadingAllowFragmentsidobj = [NSJSONSerializationJSONObjectWithData:[test dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragmentserror:nil];NSLog(@"%@", [obj class]);/* JSON數(shù)據(jù)格式和OC對象的一一對應(yīng)關(guān)系
{} -> 字典
[] -> 數(shù)組
"" -> 字符串
10/10.1 -> NSNumber
true/false -> NSNumber
null -> NSNull
*/}
}
(4)如何查看復(fù)雜的JSON數(shù)據(jù)
方法一:
在線格式化http://tool.oschina.net/codeformat/json方法二:
把解析后的數(shù)據(jù)寫plist文件,通過plist文件可以直觀的查看JSON的層次結(jié)構(gòu)浪慌。
[dictM writeToFile:@"/Users/hwm/Desktop/videos.plist"atomically:YES];