近期在工作中遇到的一个小问题。
向服务器发送请求数据的时候要使用到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;
}
相关文章
- 12-08Android Studio中Junit单元测试使用JSON对象异常的问题
- 12-08ios中多线程GCD NSOperation NSThread 相关的操作解析
- 12-08Delphi中的Sender:TObject对象解析
- 12-08递归找到一个复杂对象中的某个值和它的最小层级
- 12-08Ajax中解析Json的两种方法详解
- 12-08解析Json字符串中的指定的值
- 12-08从request对象中获取请求json格式的参数
- 12-08写一个将当前页面 URL 中的 get 参数解析成一个对象的方法。
- 12-08js中JSON对象的键(key)进行动态改变
- 12-08android-如何使用Gson解析JSON对象内的多个JSON数组?