部門的產品使用自己公司研發的系統,嵌入式web伺服器移植的是goahead2.5的,伺服器和前端使用json互動,移植的cjson庫,所以這段時間對json的使用做個簡單的筆記,cjson.h提供出來的介面很多,但是感覺平時使用的也就那麼幾個。
在做測試的時候,通過建立json物件,新增節點,然後儲存,讀取,輸出這樣的乙個流程,發現當新增節點數多的時候,會會出現長時間的等待,當時好像是一萬行的資料量,整個建立過程花費了2,3秒鐘,所以當更多資料量的時候,花費的時間可能更長。最後發現是這個函式導致的結果,原始碼如下,可以看到它每新增乙個item,都是從頭往後找,等找到最後乙個節點的時候,然後把item賦值給最後乙個節點的next,所以節點越多,時間也就更長了。
void cjson_additemtoarray(cjson *array, cjson *item)
void cjson_additemtoarray(cjson *array, cjson *item)檢視cjson的結構體,會發現,json結構有next和pre兩個指標,也就是它的鍊錶是個雙向鍊錶,但是就奇怪為何找節點卻不用這個優點,非得單向去找。else
}
typedef struct cjson cjson;2,第二種方式就很簡單,通過修改json結構體實現目的,在結構體中新增乙個成員 struct cjson * last;每次新增item的時候,同時將它的指標賦值給array->child->last;所以解決的思路就在這了,有兩種方式解決:
1,利用array的pre指標,每次插入item後,同時將其指標儲存在array->child->pre中,這樣我每次插入節點,都只需要找到第乙個節點的pre指標,然後將item插到該位址之後,即可。
cjson * c = array->child;
if(!item)
if(!c)
else
這樣每次新增的時候,只需要查詢last指標就可以找到最後乙個節點。
cjson * c = array->child;用的最多的object物件就是這些了。if(!item)
if(!c)
else
#define cjson_addnulltoobject(object,name)
#define cjson_addtruetoobject(object,name)
#define cjson_addfalsetoobject(object,name)
#define cjson_addbooltoobject(object,name,b)
#define cjson_addnumbertoobject(object,name,n)
#define cjson_addstringtoobject(object,name,s)
還有陣列物件
void cjson_additemtoarray(cjson *array, cjson *item);
void cjson_additemtoobject(cjson *object,const char *string,cjson *item);
如果是將乙個陣列新增進物件就可以用
void cjson_additemreferencetoarray(cjson *array, cjson *item);
當用完json物件時候,就必須記者刪除
cjson_delete(cjson*);
將乙個字串解析成json物件
extern cjson *cjson_parse(const char *value);
將乙個json物件轉換成char *,但是這個字串必須是手動刪除
extern char *cjson_print(cjson *item);
cJSON庫的使用(一)
在c語言裡用到json格式的字串,拼接起來就很麻煩,如果資料大,需要申請空間,如果中間要再插入乙個子項,還需要麻煩的拷貝拼接。用cjson庫的好處就是 1 拼接 插入方便。臨時增加,修改,直接用對於的介面來實現,快速,方便。2 空間申請問題由介面底層去實現。如果拼接很多,記憶體問題我們不用去過多考慮...
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 ...