#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
目录
cJSON的6种基本类型
cJSON核心结构体
反序列化相关接口
序列化相关接口
反序列化步骤
序列化步骤
/* The cJSON structure: */
typedef struct cJSON {
struct cJSON *next,*prev; /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
struct cJSON *child; /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
int type; //节点的类型type从6种类型内取值
char *valuestring; //String---valuestring 如果类型是cJSON_String,那么值会被存到这里
int valueint; //number---valueint 如果类型是cJSON_Number,且是整型,那么值会被存到这里
double valuedouble; //number---valuedouble 如果类型是cJSON_Number,且是浮点型,那么值会被存到这里
char *string; //键
} cJSON;
//把传入的字符串转成cJSON的结构(反序列化)
cJSON *cJSON_Parse(const char *value);
//把cJSON结构转成字符串(序列化)
char *cJSON_Print(cJSON *item);
//无格式化序列化,占内存少,节省内存
char *cJSON_PrintUnformatted(cJSON *item);
//释放节点的内存,防止内存泄露
void cJSON_Delete(cJSON *c);
//获取数组的长度
extern int cJSON_GetArraySize(cJSON *array);
//从数组中取出指定索引
extern cJSON *cJSON_GetArrayItem(cJSON *array,int item);
//从大的节点中取内部的子节点
extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);
//判断大节点中是否有名叫“string”的小结点
extern int cJSON_HasObjectItem(cJSON *object,const char *string);
//获取当前出错信息
extern const char *cJSON_GetErrorPtr(void);
//创建一个普通节点
cJSON *cJSON_CreateObject(void);
//创建一个数组节点
cJSON *cJSON_CreateArray(void);
//创建一个值为字符串的节点
cJSON *cJSON_CreateString(const char *string);
//把item节点增加到array的数组节点中
void cJSON_AddItemToArray(cJSON *array, cJSON *item);
//把item节点增加到object中作为子节点,item节点的键名为string
void cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
#include
#include "cJSON.h"
#include
int main(){
//1.读取文件的内容
//文件IO--标准IO
//文件流-标准IO 文件描述符--文件IO
//标准IO C库(可移植性)
//标准IO有缓冲,三个流stdin stdout stderror:效率高
//缓冲的冲刷条件:缓冲区满、换行符、强制刷新,关闭文件,结束进程
//可能会导致数据丢失甚至文件损坏,与缓冲区有关,写到内存里,掉电容易丢失,数据还没有刷到文件里,重新上电就会丢失
//硬件:超级电容,储能,断电能短暂提供三四秒的供电,电脑识别断电,成本大,两三块一个超级电容,贵。
//软件:crc校验,双备份。比如a文件损坏,就用b文件,可以节省成本
FILE *file = fopen("./data.json","r");
if(file == NULL){
perror("open error");
return -1;
}
printf("open success\n");
//2.读取内容
char buf[1024]= {0};
read(fd,buf,size);
int len = fread(fd,1024,1,file) ; //读1024个字节,读1次,效率高
//int len = fread(fd,1,1024,file) ; //读1个字节,读1024次
if(len < 0){
perror("read err");
return -1;
}
printf("buf = %s\n",buf);
//3.对buf的内容做反序列化动作
cJSON *root,*item;
root = cJSON_Parse(buf);
if(NULL==root){
printf("err parse\n");
return -1;
}
//4.解析ver节点
item = cJSON_GetObjectItem(root,"ver");
printf("ver = %s\n",item->valuestring);
//5.解析login子节点
cJSON *login = cJSON_GetObjectItem(root,"login");
item = cJSON_GetObjectItem(login,"user");
printf("user = %s\n",item->valuestring);
item = cJSON_GetObjectItem(login,"pwd");
printf("pwd = %d\n",item->valueint);
//6.解析data数组
//首先获取数组和根节点
cJSON *data = cJSON_GetObjectItem(root,"data");
len = cJSON_GetArraySize(data);
for(size_t i = 0; i < len; i++){
cJSON * tmp = cJSON_GetArrayItem(data,i);
item = cJSON_GetObjectItem(tmp,"key");
printf("key = %d\n",item->valueint);
item = cJSON_GetObjectItem(tmp,"val");
printf("val = %s\n",item->valuestring);
cJSON_Delete(root);
}
return 0;
}
cJSON *root = cJSON_CreateObject();
cJSON_AddItemToObject(root,"ver",cJSON_CreateString("1.0"));
//构造login节点
cJSON *login = cJSON_CreateObject();
cJSON_AddItemToObject(login,"uesr",cJSON_CreateString("zhangsan"));
cJSON_AddItemToObject(login,"pwd",cJSON_CreateString("123456"));
cJSON_AddItemToObject(root,"login",login));
char *p = cJSON_Print(root);
printf("root = %s\n",p);
free(p);
cJSON_Delete(root);