有如下json數(shù)據(jù),我們學(xué)習(xí)如何解析它:
{ "id":100, "username":"maye", "password":"123456", "online":false}
從文件讀取json數(shù)據(jù)
首先我們從文件中獲取json數(shù)據(jù):
const char* jsonFromFile(const char* filename){FILE* fp = fopen(filename, "r");if (!fp){return NULL;}fseek(fp, 0, SEEK_END);long len = ftell(fp);fseek(fp, 0, SEEK_SET);char* buf = calloc(len+1, sizeof(char));fread(buf, sizeof(char), len, fp);fclose(fp);return buf;}int main(){ const char* jsondata = jsonFromFile("test.json");printf("%s\n", jsondata);cJSON*root=cJSON_Parse(jsondata);//解析json數(shù)據(jù) //TODO 在這插入其他代碼 free(jsondata);//釋放內(nèi)存 cJSON_free(root); return 0;}
獲取cJSON文本
在解析或者生成json數(shù)據(jù)之后,如果需要從cJSON實(shí)體中獲得文本,可以使用以下四種方式。
cJSON_Print
函數(shù)原型:char * cJSON_Print(const cJSON *item);
該函數(shù)將一個(gè)cJSON實(shí)體渲染為字符串(有格式),注意:返回得字符串需要手動(dòng)釋放內(nèi)存
char* cjson = cJSON_Print(root);printf("%s\n", cjson);cJSON_free(cjson);//釋放
效果:
cJSON_PrintUnformatted
函數(shù)原型:char * cJSON_PrintUnformatted(const cJSON *item);
該函數(shù)將一個(gè)cJSON實(shí)體渲染為字符串(無(wú)格式,所占內(nèi)存更小,便于傳輸),注意:返回得字符串需要手動(dòng)釋放內(nèi)存
cjson = cJSON_PrintUnformatted(root);printf("%s\n", cjson);cJSON_free(cjson); //釋放
效果:
cJSON_PrintBuffered
函數(shù)原型:char * cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt)
使用緩沖策略將一個(gè)cJSON實(shí)體呈現(xiàn)為文本。Prebuffer是對(duì)蕞終大小得猜測(cè)?!安碌煤谩睖p少了再分配,提升了效率。Fmt 指定是否格式化json數(shù)據(jù)。注意:返回得字符串需要手動(dòng)釋放內(nèi)存
cjson = cJSON_PrintBuffered(root, strlen(jsondata) + 5, cJSON_True);printf("%s\n", cjson);cJSON_free(cjson); //釋放
cJSON_PrintPreallocated
使用已經(jīng)在內(nèi)存中分配得具有給定長(zhǎng)度得緩沖區(qū)將一個(gè)cJSON實(shí)體渲染為文本。成功時(shí)返回1,失敗時(shí)返回0。 注意:返回值為是否渲染成功,使用緩沖區(qū)之前先進(jìn)行判斷
char buf[1024] = { 0 };//預(yù)先準(zhǔn)備緩沖區(qū)cJSON_bool ret = cJSON_PrintPreallocated(root, buf, sizeof(buf), cJSON_True);if (ret){printf("%s\n", buf);}//這里就不需要釋放了
json數(shù)據(jù)寫(xiě)入文件
獲得json文本之后,我們就可把它保存起來(lái)了,同樣使用文件操縱,非常滴簡(jiǎn)單!
//把json數(shù)據(jù)寫(xiě)入文件,返回寫(xiě)入成功得字節(jié)數(shù)int jsonSaveFile(const char* filename,const char* cjson){FILE* fp = fopen(filename, "w");if (!fp){return NULL;}size_t len = fwrite(cjson, sizeof(char), strlen(cjson), fp);fclose(fp);return len;}int main(){const char* jsondata = jsonFromFile("test.json");cJSON* root = cJSON_Parse(jsondata);//解析json數(shù)據(jù)free(jsondata);//釋放內(nèi)存//將一個(gè)cJSON實(shí)體渲染為字符串(無(wú)格式,所占內(nèi)存更小,便于傳輸),注意:同上cjson = cJSON_PrintUnformatted(root);printf("%s\n", cjson);jsonSaveFile("format.json", cjson);cJSON_free(cjson);cJSON_free(root);return 0;}
結(jié)果:
cJSON解析json數(shù)據(jù)和從文件讀取,保存到文件得內(nèi)容就到這啦~接下來(lái)會(huì)為大家?guī)?lái)更多cJSON庫(kù)使用技巧,喜歡得不如點(diǎn)個(gè)“在看”吧