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 ]