1. 程式人生 > >OC 伺服器返回資料解析

OC 伺服器返回資料解析

本來我客戶端網路請求用的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;
}
呼叫示例:
    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);
        }];
log列印:
    post請求成功 = %24x%5E%7B2%7D%2By%5E%7B2%7D%3D1%24