·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> socket上传nsdictionary的json数据异常

socket上传nsdictionary的json数据异常

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

异常情况如下:按照正常的写法,将上传对数据封装在nsdictionary里,然后检验是否符合json格式化,调用系统的json序列化方法将nsdictionary转化为json数据然后上传,

异常结果如下:,后台只能收到收到nsdictionary的第一个{,后测试数据从nsdictionary的第一个{断开了

由于控制台打印的nsdictioanry数据如下

故猜测上传数据时"\n"作为了数据的分隔符被切断了,所以将nsdictionary转化为nsstring并且将"\n"替换为空格然后发现数据无法上传,最后追加了"\n"到nsstring末端,上传成功

完整代码如下:

#PRagma mark - GCDAsyncSocketDelegate
/**
 *  链接成功
 *
 *  @param sock sock实例
 *  @param host ip
 *  @param port 端口
 */
-(void)socket:(GCDAsyncSocket *)sock
didConnectToHost:(NSString *)host
         port:(uint16_t)port
{
    NSLog(@"didConnectToHost");
    //    gpstype:2015
    //        name:账号
    //        pswd:密码
    
    NSLog(sock.isConnected?@"YES":@"NO");
    if (sock.isConnected)
    {
/*
//nsstring上传需要加"\n"分隔符方可上传成功
[sock writeData:[@"ABCABCABCABCABCABC\n" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0]; */ NSDictionary* nsDictionaryUser=@{@"gpsinfo":@"Gpsinfo",@"pswd":self.passWord,@"other":@"666",@"gpstype":@2015,@"name":self.name}; if ([NSJSONSerialization isValidJSONObject:nsDictionaryUser]) { NSLog(@"isValidJSONObject"); NSError* error;
//先转nsdata再转nsstring是为了保证nsdictionary格式不变 NSData *nsDataUser= [NSJSONSerialization dataWithJSONObject:nsDictionaryUser options:NSJSONWritingPrettyPrinted error:&error]; NSString* json=[[NSString alloc] initWithData:nsDataUser encoding:NSUTF8StringEncoding]; // NSLog(@"nsDictionaryUser:%@",json); json=[json stringByReplacingOccurrencesOfString:@"\n" withString:@""];
//空格根据情况可以不去掉 json=[json stringByReplacingOccurrencesOfString:@" " withString:@""]; json=[json stringByAppendingString:@"\n"]; NSLog(@"json:%@",json); [sock writeData:[json dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0]; //保持读取的长连接 [sock readDataWithTimeout:-1 tag:0]; if (error) { NSLog(@"localizedDescription:%@",[error localizedDescription]); NSLog(@"localizedFailureReason:%@",[error localizedFailureReason]); } else { } } } }

 
数据上传成功了,后台可以根据数据返回数据了