JSON关键接口梳理

cJSON的6种基本类型

#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核心结构体

反序列化相关接口

序列化相关接口

反序列化步骤

序列化步骤


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);

你可能感兴趣的:(json,c++,开发语言)