由于C语言本身不支持JSON数据,所以我们可以通过cJSON使得C语言支持JSON格式的数据。
cJSON作为Json格式的解析库,其主要功能是构建和解析Json报文,用途就是一端将要发送的数据用cjson形式封装,然后发送,另一端收到此数据后,还是以cjson形式解析,就得到想要的数据了。
typedef struct cJSON {
struct cJSON *next,*prev;
struct cJSON *child;
int type;
char *valuestring;
int valueint;
double valuedouble;
char *string;
} cJSON;
1.cJSON存储的时候是采用链表存储的,其访问方式很像一颗树。每一个节点可以有兄妹节点,
通过next/prev指针来查找,它类似双向链表;每个节点也可以有孩子节点,通过child指针来访问,进入下一层。
不过,只有节点是对象或数组才可以有孩子节点。
2.type一共有7种取值,分别是:
#define cJSON_False 0
#define cJSON_True 1
#define cJSON_NULL 2
#define cJSON_Number 3
#define cJSON_String 4
#define cJSON_Array 5
#define cJSON_Object 6
若是Number类型,则valueint或valuedouble中存储着值,若你期望的是int,则访问valueint,若期望的是double,则访问valuedouble,可以得到值;
若是String类型的,则valuestring中存储着值,可以访问valuestring得到值。
3、string中存放的是这个节点的名字。
cJSON 开源项目位置: http://sourceforge.net/projects/cjson/
cJSON,目前来说,就只有两个文件,一个cJSON.c 一个cJSON.h文件。
用法:只需在函数中includecJSON.h头文件,然后和cJSON.c或库文件libcJSON.a一起编译即可使用。
在linux上,使用命令进行编译:
gcc cJSON.c test.c -o test -lm
【1】两个创建
【创建JSON对象】cJSON *cJSON_CreateObject(void);
【创建JSON数组】cJSON *cJSON_CreateArray(void);
【2】两种添加
【向对象中添加】voidcJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item);
【向数组中添加】void cJSON_AddItemToArray(cJSON *array, cJSON *item);
【3】常用几招
【向对象中增加数字】cJSON_AddItemToObject(root, “value”, cJSON_CreateNumber(value));
【向对象中增加文件】cJSON_AddItemToObject(root, “string”, cJSON_CreateString(string));
【4】JSON嵌套
【向对象中增加数组】cJSON_AddItemToObject(root, “rows”, rows = cJSON_CreateArray());
【向数组中增加对象】cJSON_AddItemToArray(rows, row = cJSON_CreateObject());
cJSON_CreateObject函数可创建一个根数据项,之后便可向该根数据项中添加string或int等内容;
cJSON_AddNumberToObject向节点中添加子节点;
cJSON_Print函数可以打印根数据项,加入制表符换行符等标识符使得JSON数据包更易阅读;
使用free函数释放被out占用的内存空间
a.cJSON_AddItemToObject(root, "value", cJSON_CreateNumber(value));
a.cJSON_AddNumberToObject(root, "value", value);
b.cJSON_AddItemToObject(root, "name", cJSON_CreateString(name));
b.cJSON_AddStringToObject(root, "name",name);
1.创建一个对象,并向这个对象里添加字符串和整型键值
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"
//创建一个对象,并向这个对象里添加字符串和整型键值
int main(int argc, char **argv)
{
cJSON *usr = NULL;
//创建根数据对象
usr = cJSON_CreateObject();
//加入键值,加字符串
cJSON_AddStringToObject(usr,"name","xiaoming");
cJSON_AddStringToObject(usr,"age","20");
//加入整数
cJSON_AddNumberToObject(usr,"num",123);
//将json形式打印成正常的字符串形式
char *out = cJSON_Print(usr);
printf("%s\n",out);
//释放内存
cJSON_Delete(usr);
free(out);
return 0;
}
执行结果
2.创建一个数组,并向数组添加一个字符串和一个数字
int create_js(void)
{
cJSON *root = NULL;
root = cJSON_CreateArray();
cJSON_AddItemToArray(root, cJSON_CreateString("Hello world"));
cJSON_AddItemToArray(root, cJSON_CreateNumber(2019));
//char *s = cJSON_PrintUnformatted(root);
char *s = cJSON_Print(root);
if(s){
printf(" %s \n",s);
free(s);
}
if(root)
cJSON_Delete(root);
return 0;
}
int main(int argc, char **argv)
{
create_js();
return 0;
}
执行结果
3.对象里面包括一个字符串和一个对象1,对象1里面添加一个字符串和一个数字
int create_js(void)
{
cJSON *root = NULL;
cJSON *js_body = NULL;
cJSON *js_list = NULL;
root = cJSON_CreateObject();
cJSON_AddItemToObject(root,"最外层",js_body = cJSON_CreateObject());
cJSON_AddItemToObject(js_body,"Rule",js_list = cJSON_CreateObject());
cJSON_AddStringToObject(js_list,"name","xiaoming");
cJSON_AddStringToObject(js_body,"enable","true,false");
cJSON_AddNumberToObject(js_list,"age",20);
char *s = cJSON_Print(root);
//char *s = cJSON_PrintUnformatted(root);
if(s)
{
printf(" %s \n",s);
free(s);
}
if(root)
cJSON_Delete(root);
return 0;
}
int main(int argc, char **argv)
{
create_js();
return 0;
}
执行结果