之前完成了乙個兩個平台對接的專案。由於這兩個平台乙個是使用json格式的資料,乙個是使用xml格式的資料,要實現它們二者的對接就涉及到這兩個資料格式的轉化,在查閱相關資料的時候發現了這個cjson庫,cjson是使用c編寫的,它輕巧易用,在網上查了相關的資料後決定在json格式的儲存於解析這塊採用cjson庫,而xml就簡單的來解析字串。
該函式需要傳入乙個json格式的字串,函式會將這個字串轉化為json格式儲存起來,函式會返回乙個表示json物件的指標,如果傳入json格式字串有誤,函式會返回null,所以在之後如果要使用它生成的json物件的指標,一定要校驗指標值
建立乙個json格式的對相關,用來儲存之後的json格式資料
建立乙個json格式的陣列
將某個資料插入到對應的json物件中,函式需要三個引數,第乙個引數是乙個json物件,表示要往哪個json物件裡面插入資料,第二個引數是乙個字串指標,表示該項的鍵值,第三個引數是乙個json物件,表示要將何種物件插入到json物件中,這個函式一般是用來插入乙個陣列物件
對於插入數值,或者字串值,如果呼叫cjson_additemtoobject,需要向將他們轉化為json物件然後插入,為了方便庫中提供了乙個巨集來方便插入數字值,它的引數與cjson_additemtoobject類似,只是最後乙個引數是乙個數字值
將字串插入json物件中,它的用法與cjson_addnumbertoobject相同
將json物件轉化為json格式的字串
由於cjson物件是用malloc函式分配的記憶體,所以需要使用這個函式來釋放分配的記憶體,否則會造成記憶體洩露。這個函式會釋放物件中的所有記憶體單元,包括使用相關函式新增到物件中的子物件,所以在釋放了物件的記憶體後,它的子物件的記憶體就不需要再次釋放了
cjson中採用該結構體來儲存json格式的資料,這個結構體儲存的是json格式的單個項,其中為了能儲存所有常用型別的資料,在裡面定義了三種型別的成員,分別表示不同的資料型別值,string 成員表示的是該項的鍵值;它裡面的三個指標分別表示同級別的下一項,上一項以及它的子節點,這些值在遍歷這個json物件中的資料時需要用到typedef
struct cjson
cjson;
上述**首先將傳進來的json格式的字串轉化為json物件,然後再遍歷這個json物件。cjson在儲存json格式的資料時,首先利用乙個空的cjson結構體來儲存整個json格式,類似於存在頭指標的鍊錶,它的child節點指標指向的是裡面的第乙個成員的資訊,所以在遍歷之前需要將指標偏移到它的child節點處。這個遍歷的整體思想是:依次遍歷它的同級節點,分別取出它的鍵和值key、value,並且將這一項組織成類似於string cjson::json2xml(const
string &strjson)
cjson *pchild = proot->child;
while (pchild != null)
else
else
strxml = strxml + "<" + strkey + ">" + strval + " + strkey + ">";
}pchild = pchild->next;
}if(null != proot)
return strxml;
}
valuekey>
它的同級節點以相同的字串結構新增到它的後面。如果某個成員中有子節點,那麼遞迴呼叫這個函式,,並將返回的值作為value,在它的兩側加上key的標籤。另外在遍歷的時候需要注意的是它的值,其實這塊可以使用cjson結構中的type來做更精準的判斷,之前我在寫這塊的**的時候沒有仔細的檢視庫的源**,所以簡單的利用valuestring指標來判斷,如果是字串那麼在字串的兩側加上引號,否則什麼都不加,在生成的xml中只需要判斷值中是否有引號,有則表示它是乙個字串,否則是乙個數字型別的值
//暫時不考慮xml標籤中存在屬性值的問題
string cjson::xml2json(const
string &strxml)
cjson_additemtoobject(pjsonroot, strnextkey.c_str(), parrayobj);
strnext = strcurrxml;
}else
}else
else}}
string strjson = cjson_print(pjsonroot);
cjson_delete(pjsonroot);
return strjson;
}
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 ...
使用cJSON庫解析JSON
cjson是乙個基於c的json解析庫,這個庫非常簡單,只有cjson.c和cjson.h兩個檔案,支援json的解析和封裝,需要呼叫時,只需要 include cjson.h 就可以使用了,json官方 json json字串 這個json物件只有兩個鍵值對,鍵name對應字串andy,鍵age對...