在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 ...