項(xiàng)目地址:https://github.com/DaveGamble/cJSON
數(shù)據(jù)封裝
#include <stdio.h>
#include "cJSON.h"
int main(void)
{
? ? cJSON* cjson_test = NULL;
? ? cJSON* cjson_address = NULL;
? ? cJSON* cjson_skill = NULL;
? ? char* str = NULL;
? ? /* 創(chuàng)建一個(gè)JSON數(shù)據(jù)對(duì)象(鏈表頭結(jié)點(diǎn)) */
? ? cjson_test = cJSON_CreateObject();
? ? /* 添加一條字符串類(lèi)型的JSON數(shù)據(jù)(添加一個(gè)鏈表節(jié)點(diǎn)) */
? ? cJSON_AddStringToObject(cjson_test, "name", "mculover666");
? ? /* 添加一條整數(shù)類(lèi)型的JSON數(shù)據(jù)(添加一個(gè)鏈表節(jié)點(diǎn)) */
? ? cJSON_AddNumberToObject(cjson_test, "age", 22);
? ? /* 添加一條浮點(diǎn)類(lèi)型的JSON數(shù)據(jù)(添加一個(gè)鏈表節(jié)點(diǎn)) */
? ? cJSON_AddNumberToObject(cjson_test, "weight", 55.5);
? ? /* 添加一個(gè)嵌套的JSON數(shù)據(jù)(添加一個(gè)鏈表節(jié)點(diǎn)) */
? ? cjson_address = cJSON_CreateObject();
? ? cJSON_AddStringToObject(cjson_address, "country", "China");
? ? cJSON_AddNumberToObject(cjson_address, "zip-code", 111111);
? ? cJSON_AddItemToObject(cjson_test, "address", cjson_address);
? ? /* 添加一個(gè)數(shù)組類(lèi)型的JSON數(shù)據(jù)(添加一個(gè)鏈表節(jié)點(diǎn)) */
? ? 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);
? ? /* 添加一個(gè)值為 False 的布爾類(lèi)型的JSON數(shù)據(jù)(添加一個(gè)鏈表節(jié)點(diǎn)) */
? ? cJSON_AddFalseToObject(cjson_test, "student");
? ? /* 打印JSON對(duì)象(整條鏈表)的所有數(shù)據(jù) */
? ? str = cJSON_Print(cjson_test);
? ? printf("%s\n", str);
? ? return 0;
}
————————————————
數(shù)據(jù)解析
#include <stdio.h>
#include "cJSON.h"
char *message =
"{? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? \"name\":\"mculover666\",? \
? ? \"age\": 22,? ? ? ? ? ? ? ? \
? ? \"weight\": 55.5,? ? ? ? ? \
? ? \"address\":? ? ? ? ? ? ? ? \
? ? ? ? {? ? ? ? ? ? ? ? ? ? ? \
? ? ? ? ? ? \"country\": \"China\",\
? ? ? ? ? ? \"zip-code\": 111111\
? ? ? ? },? ? ? ? ? ? ? ? ? ? ? \
? ? \"skill\": [\"c\", \"Java\", \"Python\"],\
? ? \"student\": false? ? ? ? ? \
}";
int main(void)
{
? ? cJSON* cjson_test = NULL;
? ? cJSON* cjson_name = NULL;
? ? cJSON* cjson_age = NULL;
? ? cJSON* cjson_weight = NULL;
? ? cJSON* cjson_address = NULL;
? ? cJSON* cjson_address_country = NULL;
? ? cJSON* cjson_address_zipcode = NULL;
? ? cJSON* cjson_skill = NULL;
? ? cJSON* cjson_student = NULL;
? ? int? ? skill_array_size = 0, i = 0;
? ? cJSON* cjson_skill_item = NULL;
? ? /* 解析整段JSO數(shù)據(jù) */
? ? cjson_test = cJSON_Parse(message);
? ? if(cjson_test == NULL)
? ? {
? ? ? ? printf("parse fail.\n");
? ? ? ? return -1;
? ? }
? ? /* 依次根據(jù)名稱(chēng)提取JSON數(shù)據(jù)(鍵值對(duì)) */
? ? cjson_name = cJSON_GetObjectItem(cjson_test, "name");
? ? cjson_age = cJSON_GetObjectItem(cjson_test, "age");
? ? cjson_weight = cJSON_GetObjectItem(cjson_test, "weight");
? ? printf("name: %s\n", cjson_name->valuestring);
? ? printf("age:%d\n", cjson_age->valueint);
? ? printf("weight:%.1f\n", cjson_weight->valuedouble);
? ? /* 解析嵌套json數(shù)據(jù) */
? ? cjson_address = cJSON_GetObjectItem(cjson_test, "address");
? ? cjson_address_country = cJSON_GetObjectItem(cjson_address, "country");
? ? cjson_address_zipcode = cJSON_GetObjectItem(cjson_address, "zip-code");
? ? printf("address-country:%s\naddress-zipcode:%d\n", cjson_address_country->valuestring, cjson_address_zipcode->valueint);
? ? /* 解析數(shù)組 */
? ? cjson_skill = cJSON_GetObjectItem(cjson_test, "skill");
? ? skill_array_size = cJSON_GetArraySize(cjson_skill);
? ? printf("skill:[");
? ? for(i = 0; i < skill_array_size; i++)
? ? {
? ? ? ? cjson_skill_item = cJSON_GetArrayItem(cjson_skill, i);
? ? ? ? printf("%s,", cjson_skill_item->valuestring);
? ? }
? ? printf("\b]\n");
? ? /* 解析布爾型數(shù)據(jù) */
? ? cjson_student = cJSON_GetObjectItem(cjson_test, "student");
? ? if(cjson_student->valueint == 0)
? ? {
? ? ? ? printf("student: false\n");
? ? }
? ? else
? ? {
? ? ? ? printf("student:error\n");
? ? }
? ? return 0;
}
————————————————
內(nèi)存及時(shí)釋放
cJSON的所有操作都是基于鏈表的雀监,所以cJSON在使用過(guò)程中大量的使用malloc從堆中分配動(dòng)態(tài)內(nèi)存的贞铣,所以在使用完之后鳞疲,應(yīng)當(dāng)及時(shí)調(diào)用下面的函數(shù),清空cJSON指針?biāo)赶虻膬?nèi)存掌眠,該函數(shù)也可用于刪除某一條數(shù)據(jù):
(void) cJSON_Delete(cJSON *item);
————————————————
原文鏈接:https://blog.csdn.net/Mculover666/article/details/103796256