根据上一个博客,我们应该是调回了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;