使用cJSON创建JSON字符串

本文作为学习cJSON的笔记,运行环境为sv2019,在stm32f103上运行运行无问题,代码中有些变量的定义在语句中出现,MDK5是不支持这样操作的,只需要将定义放在函数的开头即可,还有printf函数中的换行符需要添加\r,这样在串口助手中打印出来才会换行,头文件包含include"string.h"即可,下面是全部代码。20190709---------徐、


#include "stdio.h"
#include "cjson.h"
#include "string.h"
void cjson_create();
void json_struct_create();
void dofile(char* filename);/* 读取文件、分析、渲染等。 */
int main()
{
	printf("*********************************创建一个简单的键值对字符串********************************\n\n");
	cjson_create();
	printf("*************************将一个结构体转换为JSON字符串******************************************\n\n");
	json_struct_create();
	printf("\n\n\n");
	printf("***********************创建结构体数组的JSON串********************************\n\n\n");
	dofile("fdsf");
	return 0;
}
void cjson_create()
{
	char* name[] = {"犬夜叉PH","阿离PH","米勒法师PH","珊瑚PH","七宝PH","云母PH"};
	char* PH[] = {"100","98","100","85","80","80"};
	/*(1)创建一个json对象之后便可向这个对象中添加
	string或int等内容的数据项了使用该函数会通过
	malloc()函数在内存中开辟一个空间,使用完成需要手动释放。*/
	cJSON* root=cJSON_CreateObject();
	
	cJSON* item = NULL;
	for (int i = 0; i < 5; i++)
	{
		/*(2)调用cJSON_CreateString()函数,由一个字符串生成一个cJSON的数据项。*/
		item=cJSON_CreateString(PH[i]);
	/*3)       将上一步生成的数据项与其键值("firstName")一起添加到root对象中。*/
		cJSON_AddItemToObject(root, name[i], item);
	}
	
	/*其实到这一步,我们在内存中的cJSON对象就已经构建完成了,后面是展示结果了。
		(4)       将cJSON对象的内容解析为字符串,并展示出来。*/
		char* out = NULL;
		out = cJSON_Print(root);
		printf("out:%s\n", out);
	/*(5)       通过cJSON_Delete(),释放cJSON_CreateObject()分配出来的内存空间。*/
		cJSON_Delete(root);
	///*(6)       释放cJSON_Print()分配出来的内存空间。*/
		free(out);
}
typedef struct
{
	char Name1[10];
	char Name2[32];
	char email[23];
	int age;
	float height;
} PERSON;
void json_struct_create()
{
		PERSON  sut;
	    PERSON* person=&sut;
	strcpy(person->Name1,"犬夜叉");
	strcpy(person->Name2, "二狗子 ");
	strcpy(person->email,"825702706@qq.com");
	person->age = 15;
	person->height = 175;
	printf("name1:%s\n,name2:%s\n,age:%d\n,heighe:%d\n", person->Name1, person->Name2, person->age, person->height);
	/*看起来比一个键值对复杂多了,我们又需要学习新的接口函数了吗?
		是的,由于出现了数字,我们需要学习一个新函数:
		cJSON* cJSON_CreateNumber(double num);
	当然,创建的步骤要更复杂一些,下面我仍然是按创建过程来描述一次: 
	(1)还是先调用cJSON_ CreateObject()函数,创建一个JSON对象root,做为根(咱们可以把JSON串看成是一颗树)。
		使用该函数会通过malloc()函数在内存中开辟一个空间,使用完成需要手动释放。*/
		cJSON* root = cJSON_CreateObject();
	/*(2)继续调用cJSON_ CreateObject()函数,创建一个JSON对象obj_person,做为挂载结构体内容的对象。
		挂载内容之后,这个对象是要挂载到根上的。*/
		cJSON* obj_person = cJSON_CreateObject();
	/*(3)根据数据生成cJSON格式的数据项,调用cJSON_AddItemToObject()函数挂载到obj_person对象上。这个过程,
		要多次重复,直到将所有数据都添加上。此时要注意,不同的成员,生成的方法是不一样的。*/
			cJSON* item = cJSON_CreateString(person->Name1);
			cJSON_AddItemToObject(obj_person, "Name1", item);

			item = cJSON_CreateString(person->Name2);
			cJSON_AddItemToObject(obj_person, "Name2", item);

			item = cJSON_CreateString(person->email);
			cJSON_AddItemToObject(obj_person, "email", item);

			item = cJSON_CreateNumber(person->age);
			cJSON_AddItemToObject(obj_person, "age", item);

			item = cJSON_CreateNumber(person->height);
			cJSON_AddItemToObject(obj_person, "height", item);

		/*	(4)将obj_person对象挂载到根上。*/
				cJSON_AddItemToObject(root, "person", obj_person);
		/*	到这一步,我们在内存中的cJSON对象就已经构建完成了,后面就是展示结果。
				(5)将cJSON对象的内容解析为字符串,并展示出来。*/
				char* out = NULL;
				out = cJSON_Print(root);
			printf("out:%s\n", out);
			/*(6)通过cJSON_Delete(),释放cJSON_CreateObject()分配出来的内存空间。
				这里说明一下,我们前面调用了2次cJSON_CreateObject(),最后只需要针对root调用一次释放即可,
				因为第二次创建的对象也是挂接在root上的。*/
				cJSON_Delete(root);
			/*(7)释放cJSON_Print()分配出来的内存空间。*/
				free(out);
			/*至此,我们就使用cJSON接口完成了由结构体生成JSON字符串的工作。 */

}
//创建结构体数组的JSON串

typedef struct
{
	int id;
	char firstName[32];
	char lastName[32];
	char email[64];
	int age;
	float height;
}people;

//创建键值对
int str_to_cJSON(char* json_string, char* str_val)
{
	char* out = NULL;
	cJSON* root = cJSON_CreateObject();
	if (!root)
	{
		printf("Error before: [%s]\n", cJSON_GetErrorPtr());
		return -1;
	}
	else
	{
		cJSON* item = cJSON_CreateString("Brett");
		cJSON_AddItemToObject(root, "firstName", item);

		out = cJSON_Print(root);
		printf("out2:%s\n", out);

		cJSON_Delete(root);
		if (out != NULL)
		{
			free(out);
		}
	}
	return 0;
}

//从结构创建对象
int struct_to_cJSON(char* json_string, people* person)
{

	if ((json_string == NULL) || (person == NULL))
	{
		printf("%s: input is invalid", __func__);
	}

	char* out = NULL;
	cJSON* root = cJSON_CreateObject();

	if (!root)
	{
		printf("Error before: [%s]\n", cJSON_GetErrorPtr());
		return -1;
	}
	else
	{
		cJSON* obj_person = cJSON_CreateObject();

		cJSON* item = cJSON_CreateString(person->firstName);
		cJSON_AddItemToObject(obj_person, "名字", item);

		item = cJSON_CreateString(person->lastName);
		cJSON_AddItemToObject(obj_person, "属性", item);

		item = cJSON_CreateString(person->email);
		cJSON_AddItemToObject(obj_person, "邮箱", item);

		item = cJSON_CreateNumber(person->age);
		cJSON_AddItemToObject(obj_person, "力量", item);

		item = cJSON_CreateNumber(person->height);
		cJSON_AddItemToObject(obj_person, "身高", item);

		cJSON_AddItemToObject(root, "person", obj_person);

		out = cJSON_Print(root);
		printf("out2:%s\n", out);

		cJSON_Delete(root);
		if (out != NULL)
		{
			memcpy(json_string, out, strlen(out));
			free(out);
		}
	}

	return 0;
}


//CJSON的结构数组
int struct_array_to_cJSON(char* text, people worker[])
{
	cJSON* json, * arrayItem, * item, * object;
	int i;

	for (i = 0; i < 3; i++)
	{
		printf("i=%d, 名字=%s,属性=%s,邮箱=%s,力量=%d,身高=%f\n",
			i,
			worker[i].firstName,
			worker[i].lastName,
			worker[i].email,
			worker[i].age,
			worker[i].height);
	}

	if ((text == NULL) || (worker == NULL))
	{
		printf("%s: input is invalid", __func__);
	}

	char* out = NULL;
	cJSON* root = cJSON_CreateObject();

	if (!root)
	{
		printf("Error before: [%s]\n", cJSON_GetErrorPtr());
		return -1;
	}
	else
	{
		cJSON* array_person = cJSON_CreateArray();

		for (i = 0; i < 3; i++)
		{
			cJSON* obj_person = cJSON_CreateObject();

			cJSON* item = cJSON_CreateString(worker[i].firstName);
			cJSON_AddItemToObject(obj_person, "名字", item);

			item = cJSON_CreateString(worker[i].lastName);
			cJSON_AddItemToObject(obj_person, "属性", item);

			item = cJSON_CreateString(worker[i].email);
			cJSON_AddItemToObject(obj_person, "邮箱", item);

			item = cJSON_CreateNumber(worker[i].age);
			cJSON_AddItemToObject(obj_person, "力量", item);

			item = cJSON_CreateNumber(worker[i].height);
			cJSON_AddItemToObject(obj_person, "身高", item);

			cJSON_AddItemToArray(array_person, obj_person);
		}

		cJSON_AddItemToObject(root, "people", array_person);

		out = cJSON_Print(root);
		printf("out:%s\n", out);

		cJSON_Delete(root);
		if (out != NULL)
		{
			memcpy(text, out, strlen(out));
			free(out);
		}
	}

	return 0;
}

// 创建cjson,写入文件
void dofile(char* filename)
{
	FILE* f;
	int len;
	char data[1024];

	f = fopen(filename, "wb");
	fseek(f, 0, SEEK_END);
	len = ftell(f);
	fseek(f, 0, SEEK_SET);

	printf("read file %s complete, len=%d.\n", filename, len);

	//	char str_name[40];
	//	int ret = str_to_cJSON(data, str_name);

	people worker[3] = {
			{0,"犬夜叉","狗半妖","bbbb@126.com",100,175},
			{1,"阿离","人类","jadena@126.com",99,165},
			{2,"七宝","狐狸妖怪","cccc@126.com",90,65}
	};
	//	struct_to_cJSON(data, &worker[1]);
	struct_array_to_cJSON(data, worker);

	fwrite(data, 1, strlen(data), f);
	fclose(f);

}


运行结果截图

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值