zoukankan      html  css  js  c++  java
  • JSON 解析中遇到的坑😭

      最近做加解密遇到一个很“奇葩的问题”,解析服务端加密后的字符串 序列化 时一直报错 "json解析失败:Error Domain=NSCocoaErrorDomain Code=3840 "Garbage at end." UserInfo={NSDebugDescription=Garbage at end.}"

      既然出现问题就开始找原因,根据错误分析原因,大概是 JSON 格式字符串有问题,搜了很多答案,被误导了。

      本身使用 AES 解密后打印出来的 JSON 字符串是

    {"UserId":"D6BA8FE3-9BBB-40F2-BC04-2CC5BCF2B353","Code":"8143502","Account":"8143502","RealName":"Robin","Spell":null,"Gender":"","Mobile":"18621684680","Telephone":null,"Email":null,"WeChat_ID":null,"CompanyId":"31b05701-60ef-405c-87ba-af47049e3f48","CompanyName":"","DepartmentId":"52b73532-56ff-4db0-810e-9a915a5decf5","DepartmentName":"研发部","PostName":"","Enabled":"1","Remark":null}

       使用 JSON 格式化也没有任何问题,但是使用下面系统自带方法一直转换失败:

    - (id)dictionaryWithJsonString:(NSString *)jsonString {
        if (jsonString == nil) {
            return nil;
        }
        
        NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
        NSError *err;
        id dic = [NSJSONSerialization JSONObjectWithData:jsonData
                                                            options:NSJSONReadingMutableContainers
                                                              error:&err];
        if(err) {
            CSLog(@"json解析失败:%@",err);
            return nil;
        }
        CSLog(@"decryptResponse = %@", dic);
        return dic;
    }

      报错信息是说 JSON 后面有垃圾后缀。跟服务端同事沟通,他们一口咬定数据没问题,让客户端解决。

      推测几种可能性:

      刚开始怀疑是编码问题,但是编码方式一致,排除;

      后来怀疑是 服务端 设置了 "" 或者转义问题,但是对方不配合。。。只能这边进行转换,试了以下几种方式:

    jsonString = [jsonString stringByReplacingOccurrencesOfString:@"
    " withString:@""];
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@"
    " withString:@""];
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@"	" withString:@""];
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\" withString:@""];

      后来选择把 字符串中 的 "null" 转换以下:

    jsonString = [jsonString  stringByReplacingOccurrencesOfString:@":null"withString:@":"""];

      后来解析还是失败。。。

      后来调试时发现:

      

      后面"}"多了 "",所以解析失败:正常的如下:

      

      猜想应该是服务端给的数据经过客户端解密过程中出现了问题,开始查找解密算法问题:http://tool.chacuo.net/cryptaes

      比对 AES 的加密模式,填充,数据块,密码,向量,输出,字符集等参数,果然是数据 填充 枚举两端不一致导致的,修改后,解析正常。 

       坑总结:控制台打印出来的数据自动进行了转化,看不到完整的错误数据,不方便定位问题。

  • 相关阅读:
    ThinkPHP 3.2 调用自定义函数库
    phpstorm 2017版代码提示功能开启解决方案
    phpstorm 2017激活
    JavaScript返回上一页和返回上一级页面并刷新
    PHP处理Ajax请求与Ajax跨域
    13个能快速开发android的经典项目
    分享6款优秀的 AR/VR 开源库
    Android-----购物车(包含侧滑删除,商品筛选,商品增加和减少,价格计算,店铺分类等)
    Android------视频播放器(包含全屏播放,快退,快进,腾讯新闻的列表播放等)
    吴恩达课后作业学习2-week1-2正则化
  • 原文地址:https://www.cnblogs.com/ZachRobin/p/8400396.html
Copyright © 2011-2022 走看看