OC 伺服器返回資料解析
阿新 • • 發佈:2019-01-07
本來我客戶端網路請求用的AFNetworking,預設
manager.responseSerializer = [AFJSONResponseSerializer serializer];//設定返回資料為json
一直資料解析沒出過問題,但是突然有兩個介面伺服器直接返回了字串,對就是字串,然後我這邊就悲劇了
error = Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}
於是就將
manager.responseSerializer = [AFHTTPResponseSerializer serializer];//設定返回資料為NSData
在不影響原來介面資料解析的前提下,於是就有了下面的方法,呼叫資料來源前先資料統一處理一遍。
呼叫示例:/** * 將未知的資料型別 轉成 OC 的NSDictionary、NSArray、NSString、nil(未識別) */ + (id )resultsWithResponseObject:(id)json { if (!json || json == (id)kCFNull) { NSLog(@"原資料為nil,返回nil"); return nil; } NSData *jsonData = nil; id jsonResults = nil; if ([json isKindOfClass:[NSDictionary class]]) { NSLog(@"返回原字典"); } else if ([json isKindOfClass:[NSArray class]]) { NSLog(@"返回原陣列"); } else if ([json isKindOfClass:[NSString class]]) { jsonData = [(NSString *)json dataUsingEncoding : NSUTF8StringEncoding]; } else if ([json isKindOfClass:[NSData class]]) { jsonData = json; } if (jsonData) { jsonResults = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:NULL]; if ([jsonResults isKindOfClass:[NSDictionary class]]) { NSLog(@"JSON資料返回字典"); } else if ([jsonResults isKindOfClass:[NSArray class]]) { NSLog(@"JSON資料返回陣列"); } else if ([jsonResults isKindOfClass:[NSString class]]) { NSLog(@"JSON資料返回字串"); } else if (jsonResults == nil && [json isKindOfClass:[NSString class]]) { NSLog(@"返回原字串"); return json; } else if (jsonResults == nil && [json isKindOfClass:[NSData class]]) { // 不是陣列,不是字典,還不是字串嗎? NSString *string = [[NSString alloc] initWithData:json encoding:NSUTF8StringEncoding]; return string; } else { // 未識別 NSLog(@"未識別防止解析報錯,原資料返回nil"); NSLog(@"未識別原資料:%@",json); return nil; } return jsonResults; } return json; }
log列印:sessionTask = [manager POST:url parameters:params progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { responseObject = [self resultsWithResponseObject:responseObject]; DLog(@"post請求成功 = %@",responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { DLog(@"error = %@",error); }];
post請求成功 = %24x%5E%7B2%7D%2By%5E%7B2%7D%3D1%24