自己动手解Json!(IOS利用分治法解析Json)(一)

来源:互联网 发布:社交软件源码 编辑:程序博客网 时间:2024/05/17 09:01

  最近在IOS项目中需要从服务器端获取Json数据然后本地解析,本来任务非常简单的事情没想到后来还挺复杂尴尬 具体遇到的问题和解决方法我会在另一篇博客中写出,总之,

IOS解析Json显然不如JAVA那么方便,容错率高,另外说一下Java解析Json首推Gson,相当好用

  后来自己想,为什么不自己写一个解析Json的类呢,仔细研究了Json的结构,发现利用算法中的分治法来解决是极好的得意

  先介绍一个分治算法的思想(出自算法导论): 

  分治法在每一层递归上都有三个步骤:


  分解(Devide): 将问题分解成一系列子问题

  解决(Conquer):递归的解决各子问题,若子问题足够小,则直接求解

  合并(Combine):将子问题的结果合并成原问题的解


  说了这么多,其实我觉得分治法就是我们平常说的"递归"

  为什么说解析Json适合分治法呢,因为其实解析Json也依照了上述模式: 


  分解(Divide): Json数据可分为  键:值  的问题

  解决(Conquer):对于值不为{}这种对象的和[]这种数组的,可以直接取其键和对应的值,对于值为{}这种对象和[]这种数组,递归求其值

  合并(Combine):将的到的键与值写入到结果中


  解决思路有了,下面就要想解决方法了,在写项目的时候,最好先把整个工程中需要重复解决的问题抽象出来,写成一个方法

  比如有一个Json数据 {"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}

可能需要重复判断"的位置来判断"键"和"值",也还需要判断"{""}"这种符号来确定对象所在的范围,所以我需要有一个判断特定位置之后的特定字符的位置的方法

 代码如下:

// {"":"","":{}}/* 根据传入的Json字符串与开始寻找的位置,给出下一个所需要查找的字符出现的位置 注意如果开始寻找的位置就是给定的字符的话,就返回这个开始寻找的位置 如果没有就返回-1 */-(int) searchNextSign:(char) signChar formString:(NSString *)dicJsonString beginPostion:(int) beginPostion {        long stringLenght = dicJsonString.length;        int nextSignPostion = -1;        char postionChar;        for (int i=beginPostion; i<stringLenght; i++) {                postionChar = [dicJsonString characterAtIndex:i];                //如果等于传入的signChar的话,说明找到了,那么就可以结束循环,并返回        if (postionChar == signChar) {                        nextSignPostion = i ;                        break;                    }            }        return nextSignPostion;}

第一篇就先暂时写到这吧

第二篇链接:   自己动手解Json!(IOS利用分治法解析Json)(二)

  

  

   

  

  

0 0
原创粉丝点击