cJSON的使用——下载、打包与解析

目录

一、cJSON的下载

二、cJSON的常用函数

三、cJSON的打包例程

四、cJSON的解析例程1

五、cJSON的解析例程2


一、cJSON的下载

cjson下载

二、cJSON的常用函数

cpp 复制代码
cJSON *cJSON_Parse(const char *value);

作用:将一个JSON数据包,按照cJSON结构体的结构序列化整个数据包,并在堆中开辟一块内存存储cJSON结构体 返回值:成功返回一个指向内存块中的cJSON的指针,失败返回NULL

cpp 复制代码
cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);

作用:获取JSON字符串字段值 返回值:成功返回一个指向cJSON类型的结构体指针,失败返回NULL

cpp 复制代码
char  *cJSON_Print(cJSON *item);

作用:将cJSON数据解析成JSON字符串,并在堆中开辟一块char*的内存空间存储JSON字符串 返回值:成功返回一个char*指针该指针指向位于堆中JSON字符串,失败返回NULL

cpp 复制代码
void  cJSON_Delete(cJSON *c);

作用:释放位于堆中cJSON结构体内存 返回值:无

cpp 复制代码
void cJSON_AddItemToArray(cJSON *array, cJSON *item);
void cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item);

作用:将每一项的内容附加到指定的数组/对象 返回值:无

cpp 复制代码
cJSON_GetArraySize(const cJSON *array);
cJSON *cJSON_GetArrayItem(const cJSON *array, int item);

三、cJSON的打包例程

{

"name":"menglingjun",

"age":21

}

cpp 复制代码
void test_dabao()
{
	//打包
	cJSON * root =  cJSON_CreateObject();
	cJSON_AddItemToObject(root, "name", cJSON_CreateString("menglingjun"));//根节点下添加
    cJSON_AddItemToObject(root, "age", cJSON_CreateNumber(21));
	
	//打印
	printf("%s\n", cJSON_Print(root));
}

四、cJSON的解析例程1

{

"name":"menglingjun",

"age":21

}

cpp 复制代码
void test1_jiexi()
{
	//解析
	char jsondata[] = "{\"name\":\"menglingjun\",\"age\":21}"
	cJSON *json = nullptr,*json_name = nullptr,*json_age = nullptr;
	json = cJSON_Parse(jsondata);
	//解析失败
	if(!json)
	{
		printf("error:",cJSON_GetErrorPtr());
	}
	else
	{
		json_age = cJSON_GetObjectItem(json,"age");
		//类型是数字
		if(json_age->type == cJSON_Number)
		{
			printf("age is %d\n",json_age->valueint);
		}
		
		json_name = cJSON_GetObjectItem(json,"name");
		//类型是字符串
		if(json_name->type == cJSON_String)
		{
			printf("name is %s\n",json_age->valuestring);
		}
		
		//释放内存
		cJSON_Delete(json);
	}
}

五、cJSON的解析例程2

{

"time":"2018-11-28 09:06:12",

"forecast":[{

"date":"28日星期三",

"sunrise": "07:07",

"high":"高温 11.0C",

"low":"低温 1.0C",

"sunset": "16:50",

"aqi": 116.0,

"fx":"东风",

"fl":"<3级",

"type":"多云",

"notice":"阴晴之间,谨防紫外线侵扰"

},

{

"date":"29日星期四",

"sunrise": "08:07",

"high":"高温 15.0C",

"low":"低温 2.0C",

"sunset": "12:50",

"aqi": 110.0,

"fx":"东风",

"fl":"<3级",

"type":"多云",

"notice":"阴晴之间,谨防紫外线侵扰"

}]

}

cpp 复制代码
void test2_jiexi()
{
	//解析
	cJSON *root = cJSON_Parse(buf);
	if(root == nullptr)
	{
		printf("parse error\n");
	}
	//根据key值获取对应的value
	cJSON *value = cJSON_GetObjectItem(root,"time");
	//将数据转成字符串输出
	char *date = cJSON_Print(value);
	printf("time is %s\n",date);
	free(date);
	
	//获取数组对象
	value = cJSON_GetObjectItem(root,"forecast");
	//获取数组对象的大小
	int len = cJSON_GetArraySize(value);
	printf("len is %d\n",len);
	
	//根据下标获取对象	取出第0项
	int i = 0;
	cJSON *type_value = nullptr;
	cJSON *date_value = nullptr;
	for(i=0;i<len;i++)
	{
		date_value = cJSON_GetArrayItem(value,i);
		type_value = cJSON_GetArrayItem(value,i);
		
		//获取key对应的value
		date_value = cJSON_GetObjectItem(date_value,"date");
		type_value = cJSON_GetObjectItem(type_value,"type");
		
		//打印
		char *print1 = cJSON_Print(date_value);
		char *print2 = cJSON_Print(type_value);
		printf("date is %s,type is %s\n",print1,print2);
		free(print1);
		free(print2);
	}
	//释放内存
	cJSON_Delete(root);
}
相关推荐
越甲八千25 分钟前
STL stack为何没有迭代器
c++
从零开始的代码生活_2 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
云小逸2 小时前
【C++ 第七阶段:模板、泛型编程与工程综合详解】
开发语言·c++
GIS阵地3 小时前
QgsSingleBandPseudoColorRenderer 完整详解(QGIS 3.40.13 C++)
开发语言·前端·c++·qt·qgis
AI的探索之旅3 小时前
AI辅助原理图评审:电源去耦、BOOT引脚、VCAP——19项逐一核查,遗漏?不存在的
人工智能·vscode·嵌入式硬件
王维同学3 小时前
[原创][Windows C++]LSA 认证、安全与通知包的注册表枚举
c++·windows·安全
茯苓gao3 小时前
嵌入式开发笔记:EtherCAT协议从硬件到软件完整配置指南——从零搭建一套EtherCAT通信系统
笔记·嵌入式硬件·学习
程序员Rock3 小时前
上位机开发-MODBUS面试常见问题
c语言·c++·面试·职场和发展·上位机
GeekArch3 小时前
第24讲:Vibe模式代码风格控制——适配Keil/STM32工程规范
人工智能·stm32·单片机·嵌入式硬件·mcu·决策树·ai编程
_wyt0014 小时前
完全背包问题详解
c++·背包dp