POST_JSON
序列化:將字典或者數(shù)組 轉(zhuǎn)換成二進制數(shù)據(jù) 準(zhǔn)備發(fā)送給服務(wù)器理卑。
反序列化:從服務(wù)器接收到 二進制數(shù)據(jù) 轉(zhuǎn)換成 字典或者數(shù)組翘紊。
為什么要POST_JSON?
上傳文件時藐唠,有時候希望傳遞一些附加信息給服務(wù)器,這時可以在上傳文件的同事在POST過去這些附加信息鹉究。
例如:
上傳照片時給圖片的作者宇立、名稱、描述自赔、地理位置等信息妈嘹。
發(fā)微博時上傳圖片,還要附帶微博內(nèi)容绍妨、作者润脸、地理位置等信息。
如何向服務(wù)器發(fā)送一個對象呢他去?即發(fā)送這個對象的描述信息毙驯。我們可以將描述信息定義成JSON字符串,字典或者數(shù)組灾测,再將其序列化成二進制形式的JSON字符串爆价,發(fā)送服務(wù)器,服務(wù)器接收到之后媳搪,可以直接反序列化成JSON字符串铭段,字典或者數(shù)組。
當(dāng)我們需要向服務(wù)器發(fā)送一個OC對象時秦爆,可以將OC對象轉(zhuǎn)換成二進制形式的JSON字符串序愚,因為服務(wù)器不認(rèn)識OC對象,不能直接發(fā)送等限。
定義描述對象的信息
方式一 : 自定義JSON字符串
NSString *jsonStr = @"{"name":"zxc"}";
// 序列化
NSData *data1 = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
[self postJSONWith:data1];
方式二 : 字典,字典描述對象比自定義JSON字符串好一點兒
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"zxc" forKey:@"name"];
// JSON序列化
NSData *data2 = [NSJSONSerialization dataWithJSONObject:dict options:0 error:NULL];
[self postJSONWith:data2];
方式三 : 數(shù)組,描述多個對象
NSDictionary *dict1 = [NSDictionary dictionaryWithObject:@"zxc" forKey:@"name"];
NSDictionary *dict2 = [NSDictionary dictionaryWithObject:@"zxj" forKey:@"name"];
NSArray *arr = @[dict1,dict2];
// JSON序列化
NSData *data3 = [NSJSONSerialization dataWithJSONObject:arr options:0 error:NULL];
[self postJSONWith:data3];
NSJSONSerialization 類
A class for converting JSON to Foundation objects and converting Foundation objects to JSON. NSJSONSerialization 類是一個負(fù)責(zé) 轉(zhuǎn)換 JSON 和 Foundation 對象的類
An object that may be converted to JSON must have the following properties:
一個對象能夠被轉(zhuǎn)換成 JSON 必須符合以下條件:
Top level object is an NSArray or NSDictionary 頂級節(jié)點爸吮,必須是一個 NSArray or NSDictionary
All objects are NSString, NSNumber, NSArray, NSDictionary, or NSNull
所有的對象必須是 NSString, NSNumber, NSArray, NSDictionary, or NSNull
All dictionary keys are NSStrings
所有字典的 key 都必須是 NSString
NSNumbers are not NaN or infinity
NSNumber 不能為空或者無窮大
發(fā)送JSON的主方法
/// 發(fā)送JSON數(shù)據(jù)
-
(void)postJSONWith:(NSData *)data
{
// 獲取URL
NSURL *url = [NSURL URLWithString:@"http://localhost/php/upload/postjson.php"];
// 創(chuàng)建請求
NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url];
// 設(shè)置請求方法
requestM.HTTPMethod = @"POST";
// 設(shè)置請求體
requestM.HTTPBody = data;// 發(fā)送異步請求,請求自建服務(wù)器中的demo.json數(shù)據(jù)
[NSURLConnection sendAsynchronousRequest:requestM queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {// 判斷鏈接是否錯誤 if (connectionError) { NSLog(@"鏈接錯誤 %@",connectionError); return; } // 檢查響應(yīng)體是否有錯 NSHTTPURLResponse *HTTPURLResponse = (NSHTTPURLResponse *)response; if (HTTPURLResponse.statusCode == 200 || HTTPURLResponse.statusCode == 304) { // 反序列化 : 將二進制形式的字符串轉(zhuǎn)換成OC對象 NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",str); } else { NSLog(@"服務(wù)器內(nèi)部錯誤"); return; }
}];
}