本文作为学习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);
}
运行结果截图