cJSON库有什么用-创新互联

这篇文章主要为大家展示了“cJSON库有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“cJSON库有什么用”这篇文章吧。

成都创新互联是一家集网站建设,玛曲企业网站建设,玛曲品牌网站建设,网站定制,玛曲网站建设报价,网络营销,网络优化,玛曲网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

cJSON库是什么?

cJSON是一个轻量级的json解析库。使用起来非常简单,整个库非常地简洁,核心功能的实现都在cJSON.c文件,非常适合阅读源代码来学习C语言。最近读完这个库的源码,分享自己收获的一些心得。

什么是json,照搬json官网的说法:

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。

cJSON库里面有什么?

cjson库github地址:https://github.com/DaveGamble/cJSON
整个库包含cJSON.h和cJSON.c两个文件,头文件定义了一系列的API。这个库最基本也最重要的功能就是解析一个json字符串,使用的API是cJSON_Parse。cJSON_Parse函数调用了cJSON_ParseWithOpts函数,该函数实现了具体的逻辑。

两个函数的原型如下:

CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);
CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated);

函数接收一段字符串,然后进行解析后返回。解析完返回的是一个cjson结构,cJSON结构的定义如下:

typedef struct cJSON
{    struct cJSON *next; // 向后指针
    struct cJSON *prev; // 向前指针

    struct cJSON *child; // 指向子元素,比如子数组或者子对象

    int type; // 元素的类型

    char *valuestring; // 元素的字符串值,如果type == cJSON_String 或者 type == cJSO_Raw

    int valueint; // 已废弃,现在使用cJSON_SetNumberValue设置整型值

    double valuedouble; // 元素的整型值,如果type == cJSON_Number

    char *string; // 表示元素键值的值,如果它有子元素的话} cJSON;

如何解析一个json字符串?

json的官网在这里,http://www.json.org
网站首页描述了json是什么以及它的格式规范,有了规范之后,可以知道json是如何构成的,因此就有了如何解析json数据的方向。

json使用两种结构构建,对象或者数组。

对象使用{作开头,}作结尾,里边的每一个元素都是键值对的无序集合,键名和值使用:分隔,使用,分隔每一个元素;数组使用[作开头,]作结尾,里面的元素都是有序的值组成的集合,且使用,做分隔符。

每一个值可以是字符串,整型,也可以是true,false,null等常量,还可以是对象或数组,因为json结构是可嵌套的。

因此,我们可以得知:

1、可以根据json的首字母判断整个json的类型,如果json以'{'开头时,就是对象,以'['开头时,就是数组,否则就是字符串或者其他常量。

2、如果是对象,那么它的一定有键名,先解析它的键名,然后解析它的值,解析值的过程与第一步一样,递归解析

3、如果是数组,则逐个解析数组内的元素,直到遇到]为止,解析数组里面的元素的过程也是与第一步一致,递归解析。

这就是根据json官网的定义得出解析json字符串的思路,接下来看看cJSON库是如何实现的。cJSON_Parse的实现流程图如下:

cJSON库有什么用

cJSON_ParseWithOpts函数里面调用了parse_value,是整个函数的核心实现。
parse_value函数的流程图如下所示:
cJSON库有什么用

可以看到,parse_value是对json值的开头进行判断,然后进入相应的分支进行解析,下面对每一个分支进行分析。解析出来的值是保存在cJSON的结构体中,以下命名为item。

常量

如果json值是以'null','true','false',则分别将item的type设置为cJSON_NULL、cJSON_TRUE、cJSON_FALSE。然后继续解析剩下的json值。

string

如果遇到"开头,则说明json值是字符串,就解析它的值,此时只需要拿到两个"之间的值即可。保存字符串也是一个结构体,需要申请内存,计算长度的过程中,当遇到转义字符时,需要记录,因为转义符不保存。

number

当遇到数字开头时,将其后面的数字字符记录起来,然后转成整型数字,然后做值的范围检查。

array

解析数组时,为数组的元素创建一个新的json结构体new_item,然后继续解析数组里面的值,用','判断下一个元素的位置,得到的值保存到结构体中,并将多个元素用链表连接起来。一直解析,直到遇到']'符号。

object

解析对象的过程与数组的类似,为对象的元素创建一个新的json结构体new_item,然后继续解析对象里面的值,对象是有键值对组成的,因此先得到键的值,然后用':'判断值的位置,进而继续解析得到值,多个键值对之间用','分隔开,最后用链表连接起来。一直解析,直到遇到'}'符号。

其他

在解析所有值之前,会调用skip_whitespace函数过滤字符串两边的所有空白字符。此处是ASCII码小于等于32的字符,如:\t、\n。函数如下:

static const unsigned char *skip_whitespace(const unsigned char *in)
{    while (in && *in && (*in <= 32))
    {        in++;
    }    return in;
}

以上是“cJSON库有什么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。

当前标题:cJSON库有什么用-创新互联
文章源于:https://www.cdcxhl.com/article0/cegeoo.html

成都网站建设公司_创新互联,为您提供全网营销推广标签优化品牌网站建设网站导航定制网站小程序开发

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都定制网站建设