现在很多学习刚学习移动开发的同学,相信在培训机构,拿到后台数据的时候,格式都是正确的,甚至有的还是plist文件。但是实际开发中,我们获取数据都是通过网络接口从服务器获取数据,这些数据的格式都是后台写的,这就存在了人为可能造成的数据错误。

  在我们与服务器数据交互的时候,经常用到的是Json数据,OC也也Json中的数据格式有着一一对应的关系(网络资料一大把)。因为比如数组、字典,都是不能直接传递的,必须先转换成数据流,再将数据流转成字符串格式,进行传输。

以实际例子来说,比如我现在项目中,需要请求后台得到的数据是--“评论数据”,评论里面有一些字段,数据如下:

  这是正确的后台传输的评论数据的Json格式,最外层是“”--字符串;字符串里面是[] -- 数组,数组里面是一个一个的{}--字典,我们如果有多条评论,就是数组中的字典,变成多个字典,可以得到解析。

  但是!如果是下面这种后台回传的格式:

  

  注意这种后台回传的数据格式: 最外层还是“”--字符串,里面是[] --数组,但是数组中,又是“”--字符串,字符串中又是[],然后才是{},我们需要的字典。

  首先我们可以确定的是,这是一个Json的字符串数据,但是数据格式我们看不懂--这时候,可以用到Json格式化工具:百度搜索Josn格式化,进入网页

  

  此时,我们会发现,这个后台回传的Json字符串的格式本身就是错误的,无法解析。遇到这种情况,1是让后台改数据,改成正确的,但是问题来了,如果后台不改,我们这个任务又必须做,只能靠自己了,接下来才是我要讲的问题的重点--如何在前台解决后台回传的错误格式的Json数据问题.

  从逻辑出发,我们先拿到字典中的“comments”数据--字符串数据,然后进行Json解析:

  

  然后这里要做容错处理了! 因为请求评论数据有两个接口,一个接口是回传如我们第一张图所示的评论数据,是格式正确的,另一个接口回传的是我们上图所示的,错误格式的Json。首要思路:我们要先保证正确的Json不受影响,再来改这个错误的Json数据。

  因为如果是错误格式的Json,上图258行-str 是拿到最外层的Json字符串数据,262行是做的Json解析,但是解析完,如果还是“” -- 字符串类型,就说明是错误格式的Json数据,如果是{}--字典,就说明格式正确。

  

  容错处理的条件,如上图。

  但是我们会发现,这个条件,无论如何都会成立,就算是错误格式的Json,明明看错是字符串,也不是NSString类型的,打印obj 的类型发现,是

  

   

  难题来了:这个NSCFString 不是 NSString,而且OC中无法获取__NSCFString这个类

  解决办法如下:既然无法拿到类,用类相比,我们就拿字符串相比!

  这里可以拿到obj的类的字符串类名

  

  再用这个类名去做对比,即可实现

  然后如果不是__NSCFString类型的,说明数据格式正确,不做处理!

  如果是__NSCFString类型的,说明数据格式错误:我们就拨粽子一样,一层一层往外拨:

  

  格式如下:   第一层 -- “” 字符串

          第二层 -- [] 数组

        第三层 -- “” 字符串

        第四层 -- [] 数组

        第五层 -- {} 字典 --我们最终要得到的数据

  

  论:外层符号的去除!

  第一层:“” --如何去除:

  第二层:[] --如何去除

      因为我们发现结构都是“[]”结构,就说明里面的数组只有一个

      

  第三层:先加一个数据格式判断:判断格式是否正确

   如果是-->“” --错误Json数据的话,--解析“”

   

  

   第四层:[]-->其实我们可以得到 第三层的Json解析完的数据就是[]类型的

   

   

   最后将获取得到的第四层的数组--编译成Json数据

    

  

  然后替换掉错误格式的评论数据!

  -->字典数据的替换:1.可变字典

             2.先remove掉这个key以及所对应的数据

             3.插入正确数据

    

  

   

实际开发中,后台回传的错误格式的Json数据处理的更多相关文章

  1. Vue CLI 3开发中屏蔽的EsLint错误 (.eslintrc.js 在vue3+中 修改这个)

    1.关闭eslint校验有了eslint的校验,可以来规范开发人员的代码,是挺好的.但是有些像缩进.空格.空白行之类的规范,在开发过程中一直报错,未免太过于苛刻了.所以,我还是会选择关闭eslint校 ...

  2. Code::Blocks开发中的字符串编码错误

    刚开始使用Code::Blocks开发Windows中文应用程序的朋友们,如果在代码中使用了中文字符串,编译时可能遇到过Illegal byte sequence或Failure to convert ...

  3. WP8.1开发中关于如何显示.gif格式动态格式图片方法

    这几天又遇到个问题,就是如何显示动态图片,本来以为和显示静态图片一样,谁知不行,在网上一查才知道WP8.1不支持.gif格式动态图片的显示: 后来又在MSDN论坛上查找,也有人问类似的问题,后来就大概 ...

  4. php开发中应该注意的错误开关与常见处理[开发篇]

    我们可能一开始就接触一个项目的开发,刚开始时都是信心满满,一定把这个项目做得非常完美,但是时间那么少,任务那么多,我们就只有将就了. 首先,一般情况下,我们会加一个调试标志,define('APP_D ...

  5. ERP程序开发中遇到的六种错误

    经常回顾同事写的代码,发现一些问题,总结分析,用于员工培训,或系统优化方面的内容教学. 文中有问题的的代码我用黑体字标识. 1 界面与逻辑代码混淆 这是目前发现的比较严重的问题.框架花费了很大的力气, ...

  6. python开发中容易犯的错误整合

    写在前面 长期更新的博文.多数是一些比较隐蔽的问题.欢迎留言补充. pip并不是那么安逸 pip安装对于开发者来说确实是一种解放.可以自动安装依赖包,但执行最简单的pip安装命令时,并不是所有的依赖都 ...

  7. Xamarin.Android 开发中遇到旋转屏幕错误

    错误信息 : System.NotSupportedException: Unable to find the default constructor on type App5.MyFragment. ...

  8. jQuery开发中容易忽视的错误

    1.引用jQuery库文件的<script>标签,必须放在引用自定义脚本文件的<script>标签之前,否则,就会发生找不到对象:最好在<head>元素中,把引入样 ...

  9. ios开发中遇到的编译错误总结

    1:Undefined symbols for architecture arm64: ? 1 2 3 <code>Undefined symbols for architecture a ...

随机推荐

  1. leetcode第22题--Merge k Sorted Lists

    problem:Merge k sorted linked lists and return it as one sorted list. Analyze and describe its compl ...

  2. js 模拟QQ聊天窗口图片播放效果(带滚轮缩放)

    页面效果如下: 完整代码如下: <!DOCTYPE html> <html> <head> <title>Test</title> < ...

  3. ef左联三张表案例

    users:用户表 Orderss:订单表 U_O:用户和订单的中间表 OrdersEntities1 oe = new OrdersEntities1();            var resul ...

  4. MVC之前的那点事儿系列进入CLR

    MVC之前的那点事儿系列(1):进入CLR MVC之前的那点事儿系列,是笔者在2012年初阅读MVC3源码的时候整理的,主要讲述的是从HTTP请求道进入MVCHandler之前的内容,包括了原创,翻译 ...

  5. Bootstrap 导航

    在本文中,您将学习如何使用 Bootstrap 工具包来创建基于导航.标签.胶囊式标签的导航. 基于标签的导航 nav nav-tabs <!DOCTYPE html> <html ...

  6. SQLSERVER 数据库性能的的基本 MVC + EF + Bootstrap 2 权限管理

    SQLSERVER 数据库性能的基本 很久没有写文章了,在系统正式上线之前,DBA一般都要测试一下服务器的性能 比如你有很多的服务器,有些做web服务器,有些做缓存服务器,有些做文件服务器,有些做数据 ...

  7. 安装dynamics CRM 2013提示“实例名称必须与计算机名称相同”

    在安装CRM 2013的时候,最后一步一直提示“实例名称必须与计算机名称相同”. 原因是在安装数据库之后,我更改了计算机名称.因此就导致了可这个错. 在安装数据库的时候,数据库会记住计算机的名称,用 ...

  8. nginx 安装启动

    [root@localhost ~]# wget http://nginx.org/download/nginx-0.7.67.tar.gz --2010-09-24 14:48:12-- http: ...

  9. 百度云语音识别,Audio2Txt(c#)

    百度云识别没有提供c#版本的sdk,下面给个c#的 1.打开网址http://developer.baidu.com/ 2.登陆 3.管理控制台>开发者服务管理 4.创建工程 5.输入名称,点击 ...

  10. 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(二)

    基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(二) 之前文章中给大家说明了下我这个小小的想法,发现还是有不少人的支持和关注.你们的鼓励是对我最大的支持. 我总结了了 ...