cJSON快速使用指南

本篇内容将带领大家快速入门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);

上一篇
下一篇