服务端嵌套json

作者: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对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。**

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值