cJSON详细剖析(二)——doit(char *text)函数框架及parse_string()函数分析

这里开始第二篇博客,正式的开始分析函数。

doit(char *text)

先分析main()函数里面出现的第一个函数吧,doit()这个函数前面有英文的简单介绍此函数是干什么的,大概意思就是将文本解析为JSON格式,然后在转化为文本格式,最后进行打印。我把一些代码自己的注释在了代码后边,如下图:

cJSON详细剖析(二)——doit(char *text)函数框架及parse_string()函数分析_第1张图片

我先把text给贴出来方面大家对着代码观看:

我觉得这位作者代码功底很扎实(皮一下很开心,嘻嘻!),这代码就给人很清爽嘛,区区十来行,给人很容易理解。如果你只是需要大概的理解下该函数的作用的话,我想大概也就不需要再深究。不过因为我是来学习的,所以我得细究其具体的实现,那么我们就从第一个cJSON_Parse(text)开始跳转吧,进去看看卖的什么药。

嗯,不知道你们有没有哭,反正我是哭了,这跳转的有完没完的啊,我都不知道看到哪了。。。好吧,我们拿出小本本开始做笔记,把每一个函数的跳转记录下来。再一个一个的回去,这样就简单很多了。鉴于本人手写稿子实在是难看,我用visio画下来和大家比对比对(如果有看错的,欢迎大家留言讨论)。

cJSON详细剖析(二)——doit(char *text)函数框架及parse_string()函数分析_第2张图片

如上图所示,当跳到parse_string()函数时就是最后一个函数了,还好只有五个函数,可是刚开始看得时候还是把我看晕了。嗯好了今天我们就解决parse_string()函数

parse_string()

我先讲讲这个函数时干什么的,这给代码就是把双引号之前的字符串截取出来,保存在item->valuestring中(后续会保存在item->string,而item->valuestring保存的是冒号之后的字符串)。如下图框出来的字符串:

其中第一个while()是为了获取字符串长度,需要把该字符串保存在out里面。cJSON详细剖析(二)——doit(char *text)函数框架及parse_string()函数分析_第3张图片

后续代码比较好理解我们主要来 分析下下个while语句中的switch语句。

cJSON详细剖析(二)——doit(char *text)函数框架及parse_string()函数分析_第4张图片

要比较容易的看懂话, 我们对着前面的text1一起看,很明显在我全出来的第二个框里面,出现了‘ \\  ’,那就可以从这里开始一行一行代码的理解。

因为所举的例子也比较简单,直接就跳到default了。而里面比较复杂的是case 'u'; 所以我们还是主要来分析下这个case。我把test里面的text 都看了下,发现没有没出这种case的情况,所以如果想的话可以自己加个text,然后加个断点,进行调试一行一行进行分析,当然这有点耍小聪明了,哈哈。我就直接分析吧,后面可以在自己测试看分析的对不对。

这段代码的作用后面有写,就是将utf16的代码转化成utf8的代码。嗯。。。其实我对这些不太熟悉。我先去百度看看。

utf 是Unicode TransferFormat的缩写,即把Unicode转做为某种格式的意思。后面的数字表明至少使用多少个比特位来存储字符。我就不在这里仔细解释了,实在是费时间,我们还是搞快点比较好,如果想了解的话,这里贴一个大神讲的,讲的是真不错:https://blog.csdn.net/guxiaonuan/article/details/78678043

感到十分抱歉,我大概花了2小时来了解Unicode 、UTF8和UTF16, 内容实在是太多,这里就不在详细赘述了,如果真的想要详细了解的话,这里推荐大家看看有位大神写的博客,也就是我刚刚在看的博客,只是内容有点多。大家有兴趣的可以去看看,如果后续自己看完之后再来写一篇心得。传送门:https://www.cnblogs.com/benbenalin/p/7152570.html

就这样吧,我就不再仔细解释了,看了越多越觉得自己有太多不懂,还有太多的需要自己去掌握。希望自己好好的学习,望大家共勉。

 

 

你可能感兴趣的:(cJSON,c相关)