美文网首页
IOS 中json解析异常Domain=NSCocoaError

IOS 中json解析异常Domain=NSCocoaError

作者: 北京朝阳区精神病院院长 | 来源:发表于2020-12-12 20:04 被阅读0次

    前言

    就在今天遇到一个很诡异的技术问题,Unity调用Quick苹果SDK支付。Quick 支付需要游戏(Unity)传入一些数据到原生OC中,格式是json,在OC中打印的日志看着数据是没问题的,但是解析json却一直显示失败 。问题最终还是解决了,用倒推法给大家说一下解决的思路。

    1.jpg

    场景重现

    下面代码是OC中定义的支付方法,void *payData是接Unity中传过来的支付json数据,当用户点击支付按钮的时候,Unity把支付的数据传到IOS 原生OC中。没有了解过的可以看下之前写过的文章 :Unity接入ios SDK(小7手游)没有你想的那么难

    //支付
    void SDk_pay(void *payData){
           NSLog(@"SDk_pay"); //控制台展示这段日志说明Unity调用到了OC的支付方法
    
           NSString *idList = [NSString stringWithUTF8String:payData];
           NSLog(@"获取的支付数据=======:%@",idList);
    
           //将解析得到的内容存放字典中,编码格式为UTF8,防止取值的时候发生乱码
    
           NSData *jsonData = [idList dataUsingEncoding:NSUTF8StringEncoding];
           NSError *err;
           NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
                                                   options:NSJSONReadingMutableContainers error:&err];
           
           if(err) {
               NSLog(@"json解析失败:%@",err);
               return;
           }
    }
    

    当点击完成支付按钮后,控制台显示Json解析异常日志如下所示:

    json解析失败:Error Domain=NSCocoaErrorDomain Code=3840 "Unescaped control character around character 206." 
    UserInfo={NSDebugDescription=Unescaped control character around character 206.}
    

    解决问题思路和过程

    上面解析Json异常去Google 上去搜了一下,根据搜索内容的解释,出现这个问题的原因就是:返回的Json字符串里面有换行符、空格。既然知道是什么原因导致的,那么我们一步步分析一下。

    NSLog(@"SDk_pay");控制台有这么一段日志,说明Unity调用OC的支付方法是没问题的,成功调用到了。再看下一个日志点,获取Unity传过来的数据 idList ,传过来的数据字段如下代码:

    payLog.png

    看着上面显示的日志乍一看返回的数据都是正常,没有什么特殊啊?但是异常报错不会错的。于是把我上面的Json数据放到了格式化工具上查看,果然发现了问题所在。Json中 orderid字段多一个空格(截图中小红点就是一个空格)。

    formatJson.png

    既然知道是订单号的问题,我们来倒推一下,订单号(orderid字段)是拼的加密字符串由游戏服务器原样返回,其中一部分数据取自客户端的ChannelId。我把代码贴出来乍一看还是没问题吧。

    method.png

    其实所有问题的关键都指向了return MakeStringCopy("10184")这货。最开始我定位到GetSdkChannelId()方法里了,但是怎么看怎么也不像有空格的样子啊?于是我尝试用光标一点点试看有没有空格,一试果然试出问题了。

    下面截图就是我从有问题的那段注释里copy出来放到VSCode里面,一看10184后面已有一个空格的。当时我都惊了,同一个字符串在Xcode里面显示的正常,在VSCode里面却多出一个空格。

    Xcode(11.5版本)还有这个操作? 由于我不是专业搞IOS的,我查了资料还有询问了一些写IOS的朋友。最终结论基本上都是Xcode编译器自带的Bug。把空格去掉继续跑程序,一点事都没有。事情就这样解决了,你学废了吗?

    There is a problem.png

    结尾

    如果文章对你有帮助留下一个赞呗,你的支持是我继续写下去的动力,如有不对劳烦大家多多指正。

    相关文章

      网友评论

          本文标题:IOS 中json解析异常Domain=NSCocoaError

          本文链接:https://www.haomeiwen.com/subject/bstygktx.html