JSON的簡單介紹
-
1.什么是JSON
(1)JSON是一種輕量級的數(shù)據(jù)格式,一般用于數(shù)據(jù)交互
(2)服務(wù)器返回給客戶端的數(shù)據(jù)步绸,一般都是JSON格式或者XML格式(文件下載除外)
-
2.相關(guān)說明
(1)JSON的格式很像OC中的字典和數(shù)組
(2)標(biāo)準(zhǔn)JSON格式key必須是雙引號
"開發(fā)中的注意點":有些不標(biāo)準(zhǔn)的可能寫成單引號, 安卓和 Java 可以解析, 但是蘋果不能解析, 只能讓后臺改
-
3.JSON解析方案
a.第三方框架 JSONKit\SBJSON\TouchJSON
b.蘋果原生(NSJSONSerialization)也是性能最好的
JSON的解析
- 1)json數(shù)據(jù)->OC對象 (返序列化處理)
方法內(nèi)部實現(xiàn)了將二進制數(shù)轉(zhuǎn)換成JSON數(shù)據(jù),再將JSON數(shù)據(jù)轉(zhuǎn)換成OC對象的過程
//JSON數(shù)據(jù) -->> OC對象 方法
+(id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
// OC對象 -->> JSON數(shù)據(jù) 方法
+(NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
- 3)OC對象和JSON數(shù)據(jù)格式之間的一一對應(yīng)關(guān)系
- 4)如何查看復(fù)雜的JSON數(shù)據(jù)
JSON解析相關(guān)代碼
-
json數(shù)據(jù)->OC對象
步驟:
1.獲取請求返回的二進制數(shù)據(jù)
2.將返回的二進制數(shù)據(jù)通過NSJSONSerialization
轉(zhuǎn)換成想要的數(shù)據(jù)數(shù)組或字典數(shù)據(jù)類型
//把json數(shù)據(jù)轉(zhuǎn)換為OC對象
-(void)jsonToOC
{
//1. 確定url路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=33&pwd=33&type=JSON"];
//2.創(chuàng)建一個請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.使用NSURLSession發(fā)送一個異步請求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] 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 = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSLog(@"%@",dict);
}];
}
-
OC對象 ->JSON數(shù)據(jù)
步驟:
1.創(chuàng)建要轉(zhuǎn)換成JSON數(shù)據(jù)的OC對象
2.通過蘋果原聲的類NSJSONSerialization
OC對象轉(zhuǎn)換成JSON數(shù)據(jù)
3.通過打印轉(zhuǎn)成二進制數(shù)據(jù)的OC對象(要轉(zhuǎn)換成字符串),可以查看轉(zhuǎn)換的結(jié)果
//1.要轉(zhuǎn)換成JSON數(shù)據(jù)的OC對象*這里是一個字典
NSDictionary *dictM = @{
@"name":@"wendingding",
@"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 = [NSJSONSerialization dataWithJSONObject:dictM options:NSJSONWritingPrettyPrinted error:nil];
//3.打印查看Data是否有值
/*
第一個參數(shù):要轉(zhuǎn)換為STring的二進制數(shù)據(jù)
第二個參數(shù):編碼方式募舟,通常采用NSUTF8StringEncoding
*/
NSString *strM = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",strM);
-
JSON數(shù)據(jù)格式和OC對象的一一對應(yīng)關(guān)系
"JSON數(shù)據(jù)格式和OC對象的一一對應(yīng)關(guān)系"
{} -> 字典
[] -> 數(shù)組
"" -> 字符串
10/10.1 -> NSNumber
true/false -> NSNumber
null -> NSNull
OC對象和JSON數(shù)據(jù)格式之間的一一對應(yīng)關(guān)系
//OC對象和JSON數(shù)據(jù)之間的一一對應(yīng)關(guān)系
-(void)oCWithJSON
{
//JSON的各種數(shù)據(jù)格式
//NSString *test = @"\"wendingding\"";
//NSString *test = @"true";
NSString *test = @"{\"name\":\"wendingding\"}";
//把JSON數(shù)據(jù)->OC對象,以便查看他們之間的一一對應(yīng)關(guān)系
//注意點:如何被解析的JSON數(shù)據(jù)如果既不是字典也不是數(shù)組(比如是NSString), 那么就必須使用這NSJSONReadingAllowFragments
id obj = [NSJSONSerialization JSONObjectWithData:[test dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@", [obj class]);
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者