近期在工作中遇到的一个小问题。
向服务器发送请求数据的时候要使用到JSON,所以不能使用AFNetWorking了.因为默认的参数拼接方式不同
/** * 请求成功后的回调 * * @param json 服务器返回的JSON数据 */typedefvoid (^A8HttpSuccess)(id jsondic); /** * 请求失败后的回调 * * @param error 错误信息 */typedefvoid (^A8HttpFailure)(NSError *error);
/** * 同步与异步请求 * * @param url 请求的URL * @param isAsy 是否为异步 * @param params 参数字典 * @param success 成功的块代码回掉返回字典 * @param failure 失败的块代码回掉返回error */ + (void)requestWithMethodPosturl:(NSString *)url isAsy:(Boolean)isAsy params:(NSDictionary *)params success:(A8HttpSuccess)success failure:(A8HttpFailure)failure{ //把字典转换成jsondata NSError *error = nil; NSData *jsonData = [NSJSONSerializationdataWithJSONObject:params options:NSJSONWritingPrettyPrinted error:&error]; //输出请求json串 NSString* str = [[NSStringalloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; NSLog(@"str=%@",str); NSURL *baseURl = [NSURLURLWithString:url]; NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:baseURl]; [request setTimeoutInterval:2.0f]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:jsonData]; if (isAsy) { //是异步的请求 //异步 [NSURLConnectionsendAsynchronousRequest:request queue:[NSOperationQueuemainQueue] completionHandler:^(NSURLResponse *reponse, NSData *data, NSError *error) { if (data != nil) { NSDictionary *dicJson = [selfdictionaryWithJsonData:data]; if (success) { success(dicJson); } } elseif (data == nil && error == nil) { NSLog(@"接收到空数据"); } else { if (failure) { failure(error); } NSLog(@"%@", error.localizedDescription); } }]; }else{ //同步请求 NSError *synError; NSData *data = [NSURLConnectionsendSynchronousRequest:request returningResponse:nilerror:&synError]; if (data !=nil) { NSDictionary *dicJson = [selfdictionaryWithJsonData:data]; if (success) { success(dicJson); } }elseif(data == nil && error == nil){ NSLog(@"接收到空数据"); }else { if (failure) { failure(synError); } NSLog(@"%@", error.localizedDescription); } } }//因为接收到的JSON不是合法JSON 带有反斜杠 和多余的引号 ,这里我采用了一个比较笨的办法进行处理
先把DATA转成字符串过滤掉反斜杠与多余的引号,然后再转为Data再用NSJSONSerialization解析成字典
2014-04-11 14:14:40.118 A8LOGIN[9378:a0b] 返回的数据{"desc":"注册成功","flag":0,"code":100,"msg":"{\"uid\":8053,\"uName\":\"fucklodalv20\",\"pwd\":\"\",\"token\":\"0822ka6h9485ituo7d64qx618\",\"question\":\"\"}"} 2014-04-11 14:14:40.119 A8LOGIN[9378:a0b] 过滤后的{"desc":"注册成功","flag":0,"code":100,"msg":"{"uid":8053,"uName":"fucklodalv20","pwd":"","token":"0822ka6h9485ituo7d64qx618","question":""}"} 2014-04-11 14:14:40.119 A8LOGIN[9378:a0b] 再次过滤后的{"desc":"注册成功","flag":0,"code":100,"msg":{"uid":8053,"uName":"fucklodalv20","pwd":"","token":"0822ka6h9485ituo7d64qx618","question":""}} 2014-04-11 14:14:40.119 A8LOGIN[9378:a0b] token======注册成功 2014-04-11 14:14:40.120 A8LOGIN[9378:a0b] token======0822ka6h9485ituo7d64qx618 +(NSDictionary *)dictionaryWithJsonData:(NSData *)data{ NSString *str = [[NSStringalloc]initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"返回的数据%@",str); NSMutableString *strM = [NSMutableStringstringWithString:str]; [strM replaceOccurrencesOfString:@"\\"withString:@""options:0range:NSMakeRange(0, strM.length)]; NSLog(@"过滤后的%@\n",strM); [strM replaceOccurrencesOfString:@"\"{"withString:@"{"options:0range:NSMakeRange(0, strM.length)]; [strM replaceOccurrencesOfString:@"}\"}"withString:@"}}"options:0range:NSMakeRange(0, strM.length)]; NSLog(@"再次过滤大括号引号后的%@\n",strM); //再次把nsstring 转换成 data NSData *jsonData = [strM dataUsingEncoding:NSUTF8StringEncoding]; //重新解析json 生成字典 NSDictionary *dic = [NSJSONSerializationJSONObjectWithData:jsonData options:NSJSONReadingMutableLeaveserror:nil]; return dic; }
相关文章
- (转)使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解
- C++雾中风景番外篇:理解C++的复杂声明与声明解析
- (转)Java中JSON字符串与java对象的互换实例详解
- js中json字符串与json对象的相互转换
- 从CSV将数据重新格式化为JSON,在D3中无法正确解析
- 如何解析可能采用两种不同日期格式的日期字符串,并在iOS和Android中将其显示为本地时间?
- iOS:一种在Swift中定义NSArray内部的常规对象的方法
- js中如何删除json对象的某一个选项
- Django中的 返回json对象的方式
- js中解析json对象:JSON.parse()用于从一个字符串中解析出json对象, JSON.stringify()用于从一个对象解析出字符串。