cJSON简单使用

参考:
https://blog.csdn.net/Mculover666/article/details/103796256

cjson一般使用一个git上的项目 https://github.com/DaveGamble/cJSON

工程里都很多文件,使用时只需要将cJSON.c和cJSON.h两个文件拷贝到自己的工程,包含cJSON.h头文件使用即可。

操作都依托于cJSON结构体,一个结构体可以表示一个键值对,并且结构体还是链表中的节点。由结构体构成一个json数据的链表,节点可以嵌套(即节点可以是另一个cJSON结构体为头的链表)。

头文件提供了所需的接口函数。

创建json数据对象

cJSON * cjson_test = NULL;  //定义一个cJSON格式的指针

cjson_test = cJSON_CreateObject();  //创建一个JSON数据对象,(链表头结点)

cJSON_AddStringToObject(cjson_test, "name", "taxue123"); 
//向对象中添加一条字符串类型的JSON数据(键值对),(添加一个链表节点)
cJSON_AddNumberToObject(cjson_test, "age", 20);
//向对象中添加一条数字类型的键值对,(添加一个链表节点)
cJSON_AddBoolToObject(cjson_test, "hh", cJSON_bool(1)); //测试0为false,其他整形为true

/*添加一个嵌套的JSON数据,对cjson_test来说还是一个链表节点*/
cJSON * cjson_address = NULL;
cjson_address = cJSON_CreateObject();
cJSON_AddStringToObject(cjson_address, "country", "China");
cJSON_AddNumberToObject(cjson_address, "zip-code", 000000);

cJSON_AddItemToObject(cjson_test, "address", cjson_address);
//将cjson_address数据做值,"address"做键,嵌入到cjson_test里

/*添加一个数组类型的JSON数据*/
cJSON * cjson_skill = NULL;
cjson_skill = cJSON_CreateArray();
cJSON_AddItemToArray(cjson_skill, cJSON_CreateString("C"));
cJSON_AddItemToArray(cjson_skill, cJSON_CreateString("Java"));
cJSON_AddItemToArray(cjson_skill, cJSON_CreateString("Python"));

cJSON_AddItemToObject(cjson_test, "skill", cjson_skill);
//将cjson_skill数据做值,"skill"做键,嵌入到cjson_test里

char * json_str = NULL;
json_str = cJSON_Print(cjson_test);  //cjson的print也会申请内存,记得释放
std::cout << json_str << std::endl;
//将cjson_test输出成字符串,此函数输出带格式(换行、缩进)的字符串
cJSON_free(json_str); //如果不再需要字符串,要通过free释放掉

json_str = cJSON_PrintUnformatted(cjson_test);
std::cout << json_str << std::endl;
cJSON_free(json_str);

cJSON_Delete(cjson_test);  //通过类似Create、Parse函数申请的变量,通过delete函数释放
//使用delete释放最顶层的即可,程序会将其内容全部释放
  • 使用cJSON_CreateObject函数创建json数据对象
  • 使用cJSON_Add...ToObject类似函数向对象里添加键值对,(可以将其他cJSON对象嵌套进去)
  • 如果有数组,使用cJSON_CreateArray函数创建cJSON对象
  • 使用cJSON_AddItemToArray函数向数组的cJSON对象里添加元素
  • 使用cJSON_AddItemToObject函数将数组的cJSON对象嵌入到顶层的cJSON对象里
  • 使用cJSON_PrintUnformatted函数输出字符串形式的json数据
  • 记得释放空间,print使用cJSON_free,create的变量使用cJSON_Delete释放,cJSON只释放顶层的即可

解析json字符串

char * json_str = "...............";

cJSON * cjson_par = NULL;
cjson_par = cJSON_Parse(json_str);    //将json字符串解析成cJSON格式
if(cjson_par == NULL){
    //parse failed
    return -1;
}

/*常规通过键获取值*/
cJSON * cjson_name = cJSON_GetObjectItem(cjson_par, "name"); //根据键获取数据
if(cjson_name != NULL){
    std::cout << cjson_name->valuestring << std::endl;
}
cJSON *cjson_hh = cJSON_GetObjectItem(cjson_par, "hh");
if(cjson_hh != NULL){
    std::cout << cjson_hh->valueint <<std::endl;  //bool型用valueint获取值
    //0是false,1是true
}

/*解析嵌套的json数据*/
cJSON *cjson_addr = cJSON_GetObjectItem(cjson_par, "address");
if(cjson_addr != NULL){
    cJSON *cjson_country = cJSON_GetObjectItem(cjson_addr, "country"); //将获取的值再做cJSON取键值
    if(cjson_country != NULL){
        std::cout << cjson_country->valuestring << std::endl;
    }
    
    cJSON *cjson_zipcode = cJSON_GetObjectItem(cjson_addr, "zip-code");
    if(cjson_zipcode != NULL){
        std::cout << cjson_zipcode->valueint << std::endl;
    }
}

/*解析数组*/
cJSON *cjson_skill_par = cJSON_GetObjectItem(cjson_par, "skill");
int skill_array_size = cJSON_GetArraySize(cjson_skill_par);  //获取数组大小
std::cout << "skill:[" ;
for(int i = 0; i < skill_array_size; i++)
{
    cJSON *cjson_skill_item = cJSON_GetArrayItem(cjson_skill_par, i); //获取数组中的元素
    std::cout << " " << cjson_skill_item->valuestring;
}
std::cout << " ]" << std::endl;

cJSON_Delete(cjson_par);  //parse也要通过delete释放
  • 使用cJSON_Parse函数将字符串格式的json数据解析成cJSON链表格式
  • 使用cJSON_GetObjectItem函数获取cJSON链表中的数据,返回值是cJSON结构体指针,指向获取的键值对
  • 使用获取到的结构体中的valueint、valuestring、valuedouble等变量获取对应值
  • 嵌套的json数据,可以使用cJSON_GetObjectItem再解析获取的结构体指针
  • 数组可以使用cJSON_GetArraySize函数获取数组大小,再使用cJSON_GetArrayItem函数获取数组元素

打印结果

{
	"name":	"taxue123",
	"age":	20,
	"hh":	true,
	"address":	{
		"country":	"China",
		"zip-code":	0
	},
	"skill":	["C", "Java", "Python"]
}
{"name":"taxue123","age":20,"hh":true,"address":{"country":"China","zip-code":0},"skill":["C","Java","Python"]}



name=taxue123
1
China
0
skill:[ C Java Python ]

上一篇:Jenkins pipeline 中读取yaml文件内容


下一篇:27. 多道技术与socketserver实现并发