关于公司网站改版通知,网页素材大宝库,佛山seo关键词,网站建设神器cJSON cJSON是一个使用C语言编写的JSON数据解析器#xff0c;具有超轻便#xff0c;可移植#xff0c;单文件的特点#xff0c;使用MIT开源协议。
cJSON项目托管在Github上#xff0c;仓库地址如下#xff1a;
https://github.com/DaveGamble/cJSON
使用Git命令将其拉…cJSON cJSON是一个使用C语言编写的JSON数据解析器具有超轻便可移植单文件的特点使用MIT开源协议。
cJSON项目托管在Github上仓库地址如下
https://github.com/DaveGamble/cJSON
使用Git命令将其拉取到本地
git clone https://github.com/DaveGamble/cJSON.git 1 从Github拉取cJSON源码后文件非常多但是其中cJSON的源码文件只有两个
cJSON.h cJSON.c 使用的时候只需要将这两个文件复制到工程目录然后包含头文件cJSON.h即可如下
#include cJSON.h 1 2. cJSON数据结构和设计思想 cJSON的设计思想从其数据结构上就能反映出来。
cJSON使用cJSON结构体来表示一个JSON数据定义在cJSON.h中源码如下
/* The cJSON structure: */ typedef struct cJSON { /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */ struct cJSON *next; struct cJSON *prev; /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */ struct cJSON *child; /* The type of the item, as above. */ int type; /* The items string, if typecJSON_String and type cJSON_Raw */ char *valuestring; /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */ int valueint; /* The items number, if typecJSON_Number */ double valuedouble; /* The items name string, if this item is the child of, or is in the list of subitems of an object. */ char *string; } cJSON; cJSON的设计很巧妙。
首先它不是将一整段JSON数据抽象出来而是将其中的一条JSON数据抽象出来也就是一个键值对用上面的结构体 strcut cJSON 来表示其中用来存放值的成员列表如下
String用于表示该键值对的名称 type用于表示该键值对中值的类型 valuestring如果键值类型(type)是字符串则将该指针指向键值 valueint如果键值类型(type)是整数则将该指针指向键值 valuedouble如果键值类型(type)是浮点数则将该指针指向键值 其次一段完整的JSON数据中由很多键值对组成并且涉及到键值对的查找、删除、添加所以使用链表来存储整段JSON数据如上面的代码所示
next指针指向下一个键值对 prev指针指向上一个键值对 最后因为JSON数据支持嵌套所以一个键值对的值会是一个新的JSON数据对象一条新的链表也有可能是一个数组方便起见在cJSON中数组也表示为一个数组对象用链表存储所以
在键值对结构体中当该键值对的值是一个嵌套的JSON数据或者一个数组时由child指针指向该条新链表。
3. JSON数据封装 封装方法 封装JSON数据的过程其实就是创建链表和向链表中添加节点的过程。
首先来讲述一下链表中的一些术语
头指针指向链表头结点的指针 头结点不存放有效数据方便链表操作 首节点第一个存放有效数据的节点 尾节点最后一个存放有效数据的节点 明白了这几个概念之后我们开始讲述创建一段完整的JSON数据即如何创建一条完整的链表。
① 创建头指针 cJSON* cjson_test NULL; 1 ② 创建头结点并将头指针指向头结点 cjson_test cJSON_CreateObject(); 1 ③ 尽情的向链表中添加节点 cJSON_AddNullToObject(cJSON * const object, const char * const name);
cJSON_AddTrueToObject(cJSON * const object, const char * const name);
cJSON_AddFalseToObject(cJSON * const object, const char * const name);
cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean);
cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);
cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);
cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);
cJSON_AddObjectToObject(cJSON * const object, const char * const name);
cJSON_AddArrayToObject(cJSON * const object, const char * const name); 输出JSON数据 上面讲述一段完整的JSON数据就是一条长长的链表那么如何打印出这段JSON数据呢
cJSON提供了一个API可以将整条链表中存放的JSON信息输出到一个字符串中
(char *) cJSON_Print(const cJSON *item); 1 使用的时候只需要接收该函数返回的指针地址即可。
封装数据和打印数据示例 单纯的讲述方法还不够下面用一个例子来说明封装出开头给出的那段JSON数据
#include stdio.h #include cJSON.h
int main(void) { cJSON* cjson_test NULL; cJSON* cjson_address NULL; cJSON* cjson_skill NULL; char* str NULL; /* 创建一个JSON数据对象(链表头结点) */ cjson_test cJSON_CreateObject(); /* 添加一条字符串类型的JSON数据(添加一个链表节点) */ cJSON_AddStringToObject(cjson_test, name, mculover666); /* 添加一条整数类型的JSON数据(添加一个链表节点) */ cJSON_AddNumberToObject(cjson_test, age, 22); /* 添加一条浮点类型的JSON数据(添加一个链表节点) */ cJSON_AddNumberToObject(cjson_test, weight, 55.5); /* 添加一个嵌套的JSON数据添加一个链表节点 */ cjson_address cJSON_CreateObject(); cJSON_AddStringToObject(cjson_address, country, China); cJSON_AddNumberToObject(cjson_address, zip-code, 111111); cJSON_AddItemToObject(cjson_test, address, cjson_address); /* 添加一个数组类型的JSON数据(添加一个链表节点) */ cjson_skill cJSON_CreateArray(); cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( C )); cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( Java )); cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( Python )); cJSON_AddItemToObject(cjson_test, skill, cjson_skill); /* 添加一个值为 False 的布尔类型的JSON数据(添加一个链表节点) */ cJSON_AddFalseToObject(cjson_test, student); /* 打印JSON对象(整条链表)的所有数据 */ str cJSON_Print(cjson_test); printf(%s\n, str); return 0; } 编译运行
gcc cJSON.c example1.c -o example1.exe