使用CJSON庫實現XML與JSON格式的相互轉化

2021-08-02 02:01:15 字數 2281 閱讀 4345

之前完成了乙個兩個平台對接的專案。由於這兩個平台乙個是使用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函式分配的記憶體,所以需要使用這個函式來釋放分配的記憶體,否則會造成記憶體洩露。這個函式會釋放物件中的所有記憶體單元,包括使用相關函式新增到物件中的子物件,所以在釋放了物件的記憶體後,它的子物件的記憶體就不需要再次釋放了

typedef

struct cjson

cjson;

cjson中採用該結構體來儲存json格式的資料,這個結構體儲存的是json格式的單個項,其中為了能儲存所有常用型別的資料,在裡面定義了三種型別的成員,分別表示不同的資料型別值,string 成員表示的是該項的鍵值;它裡面的三個指標分別表示同級別的下一項,上一項以及它的子節點,這些值在遍歷這個json物件中的資料時需要用到

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;

}

上述**首先將傳進來的json格式的字串轉化為json物件,然後再遍歷這個json物件。cjson在儲存json格式的資料時,首先利用乙個空的cjson結構體來儲存整個json格式,類似於存在頭指標的鍊錶,它的child節點指標指向的是裡面的第乙個成員的資訊,所以在遍歷之前需要將指標偏移到它的child節點處。這個遍歷的整體思想是:依次遍歷它的同級節點,分別取出它的鍵和值key、value,並且將這一項組織成類似於

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