OC 服务器返回数据解析

来源:互联网 发布:淘宝对接平台 编辑:程序博客网 时间:2024/05/17 03:48

版权归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



2 0