现在很多学习刚学习移动开发的同学,相信在培训机构,拿到后台数据的时候,格式都是正确的,甚至有的还是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.插入正确数据

    

  

   

最新文章

  1. C语言流程控制
  2. linux包-下载-curl与wget
  3. stm32 cortext-M3 类型对齐问题【worldsing笔记】
  4. 笔记:利用Cocos2dx 3.3 lua 做一个动作类游戏(一)
  5. 6块300G SCSI RAID5,两块硬盘损坏的数据恢复总结
  6. redis 在 php 中的应用(key篇)
  7. 【洛谷P3810】陌上花开
  8. Java 写一段字符到指定的文本文档中,如果该文本文档不存在,则创建该文本文档
  9. CodeForces 371C Hamburgers(经典)【二分答案】
  10. 浅谈卷积和C++实现
  11. TensorFlow常用函数
  12. Spark中hashshuffle与sortshuffle
  13. C/C++基础----string, vector, array
  14. SVN服务器搭建和使用以及冲突解决、用户密码修改
  15. C++:构造函数2——拷贝构造函数
  16. poj2387 Til the Cows Come Home(Dijkstra)
  17. 11、Map、可变参数、Collections
  18. Codeforces Round #441 (Div. 2)
  19. .NET-MVC站点发布注意事项
  20. SDUT 3401 数据结构实验之排序四:寻找大富翁.!

热门文章

  1. Libgdx Box2D现实---这缓释微丸(两:Box2D介绍)
  2. 【MS SQL】把多个数据库合并为一个新的数据库
  3. 程序猿必要10免费的钱jquery小工具
  4. Varnish缓存服务详解及应用实现
  5. SpringMVC Hibernate+Spring+Spring MVC+Bootstrap的管理系统实现
  6. C语言中的内存对齐
  7. jae.jd
  8. Fitnesse集成TestLink
  9. C#多线程--仓库问题引发的故事
  10. iOS基础 - UITextField