cISON详细剖析(三)-----parse_object()函数

10 篇文章 0 订阅

根据上一个博客,我们应该是调回了parse_object(),为了看得更清楚,我继续把框图贴出来,如下图。那今天我们就来看看parse_object()函数。

parse_object()

我先把这个函数贴出来。因为有点长,为了清晰的看见我分开为俩部分,中间有一些我做了简单的注释。

开头部分

我们先看上面这部分,这也是比较简单的部分,我说简单是因为上篇博客分析过了红色框住的部分,感到抱歉的是涉及到的UTF编码我也没去细究。

这里有涉及到parse_value(child,skip(value+1))函数,咦?不知道大家对这个函数熟不熟悉,这不就是我们现在讲的这个函数的上一个函数嘛,没错,因为parse_value(child,skip(value+1))就只是一个条件跳转函数,比较简单。

那么这次根据条件是跳到哪呢,我们继续查看我们的text文件。如下图绿色框中的,我们查看parse_value()函数发现还是parse_string()函数,巧了,我们刚分析过。还是一样保存一个字符串,只是这次是保存在valuestring里面。

while()结构部分

我们来看parse_object()函数while()结构,乍一看,不就是前面的翻版嘛。可是仔细一看还是有一点不一样的地方的。在这里我用已经圈出来了。这个其实也比较好理解埃,学过链表的应该知道。就是将每一个cJSON结构体串联起来嘛,为了实现反向查找这里还用了一个cJSON指针指向上一个cJSON。如图中红色圈出的部分。这和线索二叉树比较相似,所以说数据结构式多么的重要你看,几乎都离不开数据结构的思想。希望没认真学或者没学过的可以认真学学。这里可以推荐大家去b站看,都是免费的,其中可以搜搜小甲鱼的,小甲鱼讲的数据结构讲的还不错,课本资料可以参考《大话数据结构》,个人觉得还不错。

到此,parse_object()函数其实也就讲完了,比较简单。这个函数差不多也把text字符串分析完了。接下来我们继续往回跳。parse_value(c,skip(value))函数跳转函数就不必分析了,太简单了。所以跳到下图这个函数了,我们去看看cJSON_ParseWithOpts(value,0,0)函数。

cJSON_ParseWithOpts(value,0,0)

我们先把代码贴出来,我们继续从下图中红色箭头往下看代码,哦豁,貌似比较简单哦,我们从cJSON_Parse()函数中可以发现调用的后俩参数都是0,就是说最后的俩if()都不起作用,最后返回的是  c  指针,其指向的是前面所说的cJSON链表的表头,也就是头结点。

好了,这次我们直接跳到最开始的doit()函数了,我们继续往下看,因为本来doit()函数就比较简洁,也就下图框出的比较复杂一点点。

写的有点长了,反正也打算分很多次写,cJSON_Print()函数就留在下一篇博客中写,今天是中秋的第二天,过的好快啊,明天又是放假的最后一天,可怕。下周的任务还没开始,需要好好看看论文,不然下周汇报又不知道说什么了。先到这,还早,我先去研究下cJSON_Print()函数。

ps:抱歉,一时吐槽忘记了最重要的事,返回值给忘了。。。这里总结一下返回的json结构体指针,为了方便写,我就以代码的形式贴在下面哈。


typedef struct cJSON {
	struct cJSON *next;    //null,没用到
    struct cJSON *prev;	    //null,因为这是表头
	struct cJSON *child;	//指向第一个cJSON结构体	
	int type;				//parse_object()函数里面有赋值,为cJSON_Object
	char *valuestring;		//表头为null
	int valueint;			
	double valuedouble;			
	char *string;			//同理为空,	
} cJSON;

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值