iOS網絡開發中,一般涉及到網絡請求接口,都離不開關於json數據的處理。json數據作為各個前端和后台交互傳遞數據的格式,具有跨平台,輕型數據量,簡潔易懂的優點。
json被廣泛應用於Android,iOS,HTML5等於后台服務器交互的場景中,json作為一個跨平台的交互數據格式,必定有對象與二進制數據的轉換,因為所有的不同平台之間傳遞信息識別的數據類型就是二進制。
iOS中的json數據處理核心就是json串與json對象之間的轉換。json串與json對象都是基於iOS中NSObject類,在與后台的交互中,NSObject類與NSData類之間能互相轉換,用於數據交互。
NSData與NSObject類之間的轉換在iOS框架中很簡單,也很常見,此處不再贅述,本篇着重討論json串與json對象的轉換。
#====================從后台接收數據的處理===================================
從后台接收到的數據一般為NSData類型的,可以直接用iOS框架提供的json解析類進行解析,直接得到的就是json對象。
//獲取接口反饋的字符串數據,此處用的是MKNetworkKit網絡庫 NSString *responseString = [completedOperation responseString]; NSData *responseData = [responseString dataUsingEncoding:NSUTF8StringEncoding]; if (responseData != nil) { id jsonObject = nil; NSError *error = nil; jsonObject = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableLeaves error:&error]; if (error == ill) { //判斷jsonObject為NSArray還是NSDictionary } else { //json解析出錯處理 } }
如果后台返回的鍵值對中包含有json字符串類型,那么就要對json串進行解析處理
+ (id)jsonObjectWithString:(NSString *)string { NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; NSError *error; id jsonObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error]; if (error == nil) { return jsonObject; } else { DLog(@"%@",error.localizedDescription); return nil; } }
#====================前端傳遞給后台json格式的處理===================================
若在調用后台的接口時需要給后台傳遞json數據,一般是把json的NSArray貨NSDictionary類型轉換為NSString類型,然后可以選擇鍵值對參數或NSData二進制格式傳遞給后台。
json集合對象轉換為json串的代碼
+ (NSString *)jsonStringWithObject:(id)jsonObj { NSString *jsonString = nil; NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonObj options:0 error:&error]; if (! jsonData) { DLog(@"Got an error: %@", error); } else { jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; } return jsonString; }