OC 服務器返回數據解析

版權歸Aaidong所有〜轉載需聲明〜  原貼地地址:http://blog.csdn.net/aaidong/article/details/53043938


本來我客戶端網絡請求用的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



發佈了47 篇原創文章 · 獲贊 16 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章