本篇内容将带领大家快速入门cJSON开源库的使用,主要是为了能够快速上手cJSON的基础使用,主要是对于一个cJSON文件的打开与读取,对于一般的读取配置文件已经足够使用了
cJSON对象的实现使用的是树结构,每个对象是树的一个节点,每个节点由cJSON这个结构体组成,对象中的元素也由cJSON这个结构体组成。同一层的对象和元素是双向链表结构,由next和prev指针链接。不同层的对象或元素由child指针链接起来。type表示对象或元素类型,string表示对象或节点的名称。元素的值存储在valuestring, valueint和valuedouble中,cJSON.h中有详细的注释。
为什么选择使用cJSON来构造和解析JSON字符串?因为它具有超轻便,可移植,单文件的特点,使用MIT开源协议。其中主要包括两个文件cjson.c和cjson.h。
cJSON开源地址:https://github.com/DaveGamble/cJSON
cJSON结构体
cJSON结构体的定义如下:
typedef struct cJSON {
struct cJSON *next,*prev; /* next是获取下一个元素数据,prev是获取前一个元素数据 */
struct cJSON *child; /* 获取第一个元素数据,当需要获取下一个时,就得使用next了. */
int type; /* 当前的json类型对象、数组、字符串、数字、null、true、false等 */
char *valuestring; /* 字符串值, if type==cJSON_String */
int valueint; /* 整形类型值, if type==cJSON_Number */
double valuedouble; /* 浮点数类型值, if type==cJSON_Number */
char *string; /* 这个是键 */
} cJSON;
cJSON主要是通过结构体cJSON进行存储数据
type类型
/* cJSON Types: */
#define cJSON_False 0 // true
#define cJSON_True 1 // false
#define cJSON_NULL 2 // NULL
#define cJSON_Number 3 // 数字
#define cJSON_String 4 // 字符串
#define cJSON_Array 5 // 数组
#define cJSON_Object 6 // 对象
cJSON_Parse
字符串生成cJSON指针的函数,使用后需要调用cJSON_Delete进行释放
extern cJSON *cJSON_Parse(const char *value);
// 释放cJSON_Parse返回的指针
extern void cJSON_Delete(cJSON *c);
cJSON_Print
cJSON指针生成字符串的函数,使用下面这两个函数生成了字符串使用完后一定要free释放
// 这个生成的字符串有做格式调整
extern char *cJSON_Print(cJSON *item);
// 这个没有作格式调整,就是一行字符串显示
extern char *cJSON_PrintUnformatted(cJSON *item);
打开一个JSON文件
1.首先要使用通用方式打开文件
FILE *file = fopen(filename,"r");
if(!file)
{
fprintf(stderr,"ERROR:failed to open file %s\r\n",filename);
return nullptr;
}
2.然后要获取该文件的大小,为后续创建cJSON实例计划空间
struct stat statbuf;
stat(filename,&statbuf);
size_t fileSize = statbuf.st_size;
printf("file %s size is %ld\r\n",filename,fileSize);
char *jsonStr = (char *)malloc(sizeof(char) * fileSize + 1);
memset(jsonStr,0,fileSize + 1);
3.读取文件内容到堆区,注意使用后释放
char *jsonStr = (char *)malloc(sizeof(char) * fileSize + 1);
memset(jsonStr,0,fileSize + 1);
size_t size = fread(jsonStr,1,fileSize,file);
if(size <= 0)
{
fprintf(stderr,"ERROR:failed to read from file %s",filename);
fclose(file);
free(jsonStr);
return nullptr;
}
//printf("%s\r\n",jsonStr); //打印读取的json文件
fclose(file);
4.解析字符串分配cJSON实例,注意使用完后一定要去释放
cJSON *root = cJSON_Parse(jsonStr);
if(!root)
{
fprintf(stderr,"ERROR:failed to parse str\r\n");
free(jsonStr);
return nullptr;
}
cJSON_GetObjectItem
cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);
获取某个JSON对象内部的某个成员
例如:
cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);