C++經常使用函數 XML JSON格式轉換php
數據格式在編程裏面很常見,不一樣的系統都會有本身的標準。由於給有各的定義,每次作第三方開發系統對接的時候數據格式標準都是頭疼的事情。html
在開發過程當中比較常見的好比有Json、XML、Key-Value等。這裏咱們就先看看Json和XML。二者的轉換有不少開源的代碼可使用,並且也很完善,能夠參考xml2json 、xsltjson 。ios
XML在Json出現前應用很普遍,靈活性好,應用語言也沒有限制,發展了這麼長時間後xml標準已經很臃腫。這裏能夠查看XML的標準 XML標準。在C++裏面解析和操做XML的庫也有很多,tinyxml 就是個不錯的選擇,體積少、簡單、高效的開源庫,如今已經發布了TinyXml-2.c++
Json出來後當即被不少高級語言做爲了標準推薦使用,若是想了解Json的定義請點擊這裏:JSON定義git
接下來,我想作個簡單的函數來轉換。github
<xml> <appid>appid-value111111</appid> <mch_id>mch_id-value22222</mch_id> <nonce_str>nonce_str-value3333333</nonce_str> <transaction_id>transaction_id-value44444444</transaction_id> <sign>sign-value5555555555</sign> </xml>
上面的報文是在三方支付裏面常見的報文,此次咱們來實現對這段報文的Json格式的自由轉換。shell
#include <string> #include <iostream> #include "tinyxml2.h" #include "nlohmann/json.hpp" using json = nlohmann::json; using namespace tinyxml2; using namespace std; string xml2json(string &src) { XMLDocument doc; doc.Parse( src.c_str() ); json root; XMLElement* rootElement = doc.RootElement(); XMLElement* child = rootElement->FirstChildElement(); while(child) { const char* title = child->Name() ; const char* value = child->GetText(); child = child->NextSiblingElement(); root[title]=value ; } return root.dump() ; } string json2xml(string& src) { XMLDocument xmlDoc; XMLNode * pRoot = xmlDoc.NewElement("xml"); xmlDoc.InsertFirstChild(pRoot); auto j3 = json::parse(src.c_str()); for (json::iterator it = j3.begin(); it != j3.end(); ++it) { string key = it.key(); string value = it.value() ; XMLElement * pElement = xmlDoc.NewElement(key.c_str()) ; pElement->SetText(value.c_str()) ; pRoot->InsertEndChild(pElement); } XMLPrinter printer; pRoot->Accept( &printer ); return printer.CStr(); } int main() { string src = "<xml>\ <appid>appid-value111111</appid>\ <mch_id>mch_id-value22222</mch_id>\ <nonce_str>nonce_str-value3333333</nonce_str>\ <transaction_id>transaction_id-value44444444</transaction_id>\ <sign>sign-value5555555555</sign>\ </xml>" ; string json = xml2json(src) ; string xml = json2xml(json) ; cout << json ; cout << endl ; cout << xml ; }
此次咱們使用tinyxml2 和nlohmann json 作轉換,須要將二者的頭文件和源代碼文件下載,並在編譯中include。編程
nolhmann json 須要C++ 11 的支持,gcc版本須要在4.7以上。json
可使用下面命令編譯:app
g++ -std=c++11 xmljson.cpp tinyxml2.cpp -I./
./a.out {"appid":"appid-value111111","mch_id":"mch_id-value22222","nonce_str":"nonce_str-value3333333","sign":"sign-value5555555555","transaction_id":"transaction_id-value44444444"} <xml> <appid>appid-value111111</appid> <mch_id>mch_id-value22222</mch_id> <nonce_str>nonce_str-value3333333</nonce_str> <sign>sign-value5555555555</sign> <transaction_id>transaction_id-value44444444</transaction_id> </xml>
C++經常使用函數 XML JSON格式轉換 https://www.cppentry.com/benc...