cJSON庫的使用(一)

2021-10-02 19:43:51 字數 4634 閱讀 2698

在c語言裡用到json格式的字串,拼接起來就很麻煩,如果資料大,需要申請空間,如果中間要再插入乙個子項,還需要麻煩的拷貝拼接。用cjson庫的好處就是:

1、拼接、插入方便。臨時增加,修改,直接用對於的介面來實現,快速,方便。

2、空間申請問題由介面底層去實現。如果拼接很多,記憶體問題我們不用去過多考慮,只要知道怎麼用就可以避免記憶體洩露問題。

3、格式統一。書寫方便,可能有些地方會加中括號,有些沒有。用這個可以省掉這種麻煩。

4、使用拓展方便。需要臨時增加,或者再加入內容,比較便捷,高效。不用再自己用一大串的轉義符加雙引號來拼接了。

}

注:結合json檢視工具,可以把json資料結構化展示出來,清晰明了

1、一對大括號括起內容

2、內部使用key:value

key值為字串

value值可以取值:字串、數值型別、陣列型別、物件{}、null、布林值

/*內部函式簡介:*/

1、cjson_parse(char*) //用於解析利用c字串儲存的json字串

會生成乙個cjson格式的結構體

2、cjson_print(cjson*) //用於輸出json字串解析後的資料

把cjson結構體轉換成c字串

3、cjson_delete(cjson*)//釋放cjson*型別資料

簡單使用:

#include #include #include "cjson.h"

int main(void)

"; //解析data字串,儲存成cjson結構體

cjson *json = cjson_parse(data);

char *json_data = null;

printf("data : %s\n", json_data = cjson_print(json));

free(json_data);

cjson_delete(json);

return 0;

}

注:測試檔案需要使用數學庫,需要加入-lm

加數學庫:-lm

注:不是-lmath

floor:向下取整

ceil:向上取整

注:快捷方式:[ + d:快速列出巨集定義

<1>建立乙個值型別的資料

注:不管什麼型別的資料轉換後都是cjson結構體

extern cjson* cjson_createnumber(double num)

extern cjson* cjson_createstring(const char *string)

extern cjson* cjson_createarray(void)

<2>建立乙個物件(文件)

extern cjson* cjson_createobject(void); //建立json物件,相當於建立了一對{}
<3>陣列建立及新增

cjson* cjson_createintarray(const int *numbers, int count)

void cjson_additemtoarray(cjson *array, cjson *item)

//例子

cjson* array = null;

cjson_additemtoarray(array, cjson_createstring("lol"));

cjson_additemtoarray(array, cjson_createstring("nba"));

cjson_additemtoarray(array, cjson_createstring("shopping"));

<1>向物件中增加鍵值對

cjson_additemtoobject(root, "rows", 值資料型別的相關函式());
<2>在物件中增加陣列

cjson_additemtoobject(root, "rows", cjson_createarray());
<3>向陣列中增加物件

cjson_additemtoarray(rows, cjson_createobject());
<4>幾個可以提高操作效率的巨集函式

#define cjson_addnumbertoobject(object, name, n) \

cjson_additemtoobject(object, name, cjson_createnumber(n))

#define cjson_addstringtoobject(object, name, s) \

cjson_additemtoobejct(object, name, cjson_createstring(s))

<5>新增乙個元素到json物件中:cjson_additemtoobject(json, "key", value)

value取值:

字串 ---》cjson_createstring("value");

數值 ---》cjson_createnumber(29);

陣列 ---》cjson_createarray(void);

物件 ---》cjson_createobject(void);

----》json = cjson_createobject(); //相當於建立乙個大括號

----》cjson_additemtoobject(json, "name", cjson_createstring("hmh")) //json物件加元素

注:gcc -o demo test2.c cjson.* -lm

#include #include #include #include "cjson.h"

int main(void)

//*****=>cjson_addstringtoobject(json, "name", "hmh")

cjson_additemtoobject(json, "name", cjson_createstring("hmh"));

cjson_additemtoobject(json, "age", cjson_createnumber(29));

cjson* array = null;

cjson_additemtoobject(json, "love", array = cjson_createarray());

cjson_additemtoarray(array, cjson_createstring("lol"));

cjson_additemtoarray(array, cjson_createstring("nba"));

cjson_additemtoarray(array, cjson_createstring("shopping"));

//巨集的使用

cjson_addnumbertoobject(json, "score", 59);

cjson_addstringtoobject(json, "address", "beijing");

//將json結構體格式化到緩衝區

char *buf = cjson_print(json);

//開啟檔案用以寫入json資料

file *fp = fopen("test2.json", "w");

fwrite(buf, 1, strlen(buf), fp);

free(buf);

fclose(fp);

//釋放json結構體所佔的記憶體

cjson_delete(json);

return 0;

}

在上面我們對cjson進行了一些簡單分析,包括解析、打包這兩種最常用功能,cjson的移植相對簡單,但是在使用的時候,還是有一些特別需要注意的地方的,這 主要是因為 cjson庫 中的一些函式會進行記憶體申請操作,但是並不會自動釋放記憶體,這就相當於 是風險, 需要使用者自己去及時的釋放 記憶體。如果處理不當,會造成記憶體用完,進而程式也執行不了多久就廢掉了。所以需要特別注意的地方:

(1)使用cjson_parse建立乙個 cjson指標後,用完務必 使用 cjson_delete函式釋放 該cjson指標。

(2)使用cjson_create***函式建立 json物件後, 用完務必使用 cjson_delete函式釋放 該cjson指標。

(3)使用 cjson_print函式 將cjson資料 解析成 char 字串後,務必使用 cjson_free函式釋放 該char指標,這個 細節隱藏的很深,因為cjson_print 函式不光是 print列印,他會 呼叫cjson_malloc 申請記憶體,所以用完 必須要釋放 掉 該char 指標。

cjson_delete(root);    //非常重要!!!!!!

cjson_free(payload);   //非常重要!!!!!!

cJSON 庫的使用和優化

部門的產品使用自己公司研發的系統,嵌入式web伺服器移植的是goahead2.5的,伺服器和前端使用json互動,移植的cjson庫,所以這段時間對json的使用做個簡單的筆記,cjson.h提供出來的介面很多,但是感覺平時使用的也就那麼幾個。在做測試的時候,通過建立json物件,新增節點,然後儲存...

linux下使用C Json庫

3 解壓scons 2.1.0.tar.gz tar zvxf scons 2.1.0.tar.gz 我的解壓到了 opt json scons 2.1.0目錄下了 4 進入到解壓目錄scons 2.1.0下面,執行命令 sudo python setup.py install 5 解壓jsconc...

linux下使用C Json庫

安裝json庫 3 解壓scons 2.1.0.tar.gz tar zvxf scons 2.1.0.tar.gz 我的解壓到了 opt json scons 2.1.0目錄下了 4 進入到解壓目錄scons 2.1.0下面,執行命令 sudo python setup.py install 5 ...