作者:Love@YR
链接:http://blog.csdn.net/jingqiu880905/article/details/50593656
请尊重原创,谢谢!
首先我们和服务端约定传过去的httpbody的content-type是application/json格式的,服务端返回给我们的也是。
来看AFNetworking是怎么处理的。
首先我们来看看request:(AFURLRequestSerialization类)
if (parameters) {
if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) {
[mutableRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
}
[mutableRequest setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:self.writingOptions error:error]];
NSString *json=[[NSString alloc]initWithData:[NSJSONSerialization dataWithJSONObject:parameters options:self.writingOptions error:error] encoding:NSUTF8StringEncoding];
NSLog(@"json========%@",json);
}
而像x-www-form-urlencoded格式
if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) {
[mutableRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
}
[mutableRequest setHTTPBody:[query dataUsingEncoding:self.stringEncoding]];
接下来我们看看response(AFURLResponseSerialization里)
AFJSONResponseSerializer的实现里
说明了接收的contentType
self.acceptableContentTypes = [NSSet setWithObjects:@”application/json”, @”text/json”, @”text/javascript”, nil];
在我们的项目里
AFHTTPRequestOperationManager *manager = [CTBaseSender ShareHttpManager];
[manager setSecurityPolicy:[CTBaseSender shareSecurityPolicy]];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
说明了我们接收的response是json格式的。
下面出现一种问题,当我们得到的response经过反序列化之后某个字段还是一个json格式的字串(也就是说服务发送了嵌套json),有反斜杠,怎样把它转化成dictionary供我们使用呢?怎样解析成json字串呢?
responseObject={
needCtripPay = 1;
orderNo = 14538658753680;
payParameter = "{\"head\":{\"version\":\"1\",\"platform\":\"iOS\",\"language\":0,\"request_id\":\"06dcbf1f-7595-4623-bdc9-cc0d2c46daf3\",\"out_user_id\":\"18637673890\",\"service_name\":\"PaymentRequest\",\"merchant_id\":\"3000003\",\"time_stamp\":\"20160127113756\",\"comress_type\":\"0\"},\"sign\":\"F3ERRUB2/QKXLBNV/pWhe0gqHezfHGp9e9ZtB5RPA7EX/84dEXnGZhgv3zqXUPvlPTqxAm7AedrJTmTuvKpWSPT4/d5baldYK/A87zVZh7bvZoZN2OPHUqy31f3VDxkNIKp2gyc8eFh4aXJdrIGuG0tBseUnPHkorLbWFqUpVE0=\",\"transaction_id\":\"549fa16d-3242-4623-9961-52e517da9bbc\",\"out_trade_id\":\"1453865875368026\",\"pay_token\":\"hNcUFSrJUJvECJykh4gs/A8colc=\",\"security_type\":\"RSA\"}";
}
其中的payParameter
NSString *payParameter=[responseObject objectForKey:@"payParameter"];//nsstring的字串
NSData *data=[payParameter dataUsingEncoding:NSUTF8StringEncoding];//转换成data
NSDictionary *paymentInfoDic= [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];//符合json格式的字串反序列化成dictionary
NSData* jsonData =[NSJSONSerialization dataWithJSONObject:paymentInfoDic
options:NSJSONWritingPrettyPrinted error:NULL];//转换成data
NSString * jsonString =[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];//再序列化成json串
**把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。
对象的序列化主要有两种用途:
1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。
在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。**