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