TOP

C++常用函数 XML JSON格式转换
2019-11-06 15:14:00 】 浏览:49
Tags:C++ XML JSON tinyxml2 nlohmann

数据格式在编程里面很常见,不同的系统都会有自己的标准。因为给有各的定义,每次做第三方开发系统对接的时候数据格式标准都是头疼的事情。

在开发过程中比较常见的比如有Json、XML、Key-Value等。这里我们就先看看Json和XML。两者的转换有很多开源的代码可以使用,而且也很完善,可以参考xml2json 、xsltjson 。

XML在Json出现前应用很广泛,灵活性好,应用语言也没有限制,发展了这么长时间后xml标准已经很臃肿。这里可以查看XML的标准 XML标准。在C++里面解析和操作XML的库也有不少,tinyxml 就是个不错的选择,体积少、简单、高效的开源库,现在已经发布了TinyXml-2.

Json出来后立即被很多高级语言作为了标准推荐使用,如果想了解Json的定义请点击这里:JSON定义

XML2Json & Json2XML

接下来,我想做个简单的函数来转换。

  1. <xml>

  2. <appid>appid-value111111</appid>

  3. <mch_id>mch_id-value22222</mch_id>

  4. <nonce_str>nonce_str-value3333333</nonce_str>

  5. <transaction_id>transaction_id-value44444444</transaction_id>

  6. <sign>sign-value5555555555</sign>

  7. </xml>

上面的报文是在三方支付里面常见的报文,这次我们来实现对这段报文的Json格式的自由转换。

  1. #include<string>

  2. #include<iostream>

  3. #include"tinyxml2.h"

  4. #include"nlohmann/json.hpp"

  5. using json = nlohmann::json;

  6. usingnamespace tinyxml2;

  7. usingnamespace std;

  8. string xml2json(string&src)

  9. {

  10. XMLDocument doc;

  11.     doc.Parse( src.c_str());

  12.     json  root;

  13. XMLElement* rootElement = doc.RootElement();

  14. XMLElement* child = rootElement->FirstChildElement();

  15. while(child){

  16. constchar* title = child->Name();

  17. constchar* value = child->GetText();

  18.         child = child->NextSiblingElement();

  19.         root[title]=value ;

  20. }

  21. return  root.dump();

  22. }

  23. string json2xml(string& src)

  24. {

  25. XMLDocument xmlDoc;

  26. XMLNode* pRoot = xmlDoc.NewElement("xml");

  27.     xmlDoc.InsertFirstChild(pRoot);

  28. auto j3 = json::parse(src.c_str());

  29. for(json::iterator it = j3.begin(); it != j3.end();++it){

  30. string key = it.key();

  31. string value = it.value();

  32. XMLElement* pElement = xmlDoc.NewElement(key.c_str());

  33.         pElement->SetText(value.c_str());

  34.         pRoot->InsertEndChild(pElement);

  35. }

  36. XMLPrinter printer;

  37.     pRoot->Accept(&printer );

  38. return printer.CStr();

  39. }

  40. int main()

  41. {

  42. string src ="<xml>\

  43.                    <appid>appid-value111111</appid>\

  44.                    <mch_id>mch_id-value22222</mch_id>\

  45.                    <nonce_str>nonce_str-value3333333</nonce_str>\

  46.                    <transaction_id>transaction_id-value44444444</transaction_id>\

  47.                    <sign>sign-value5555555555</sign>\

  48.                 </xml>";

  49. string json = xml2json(src);

  50. string xml = json2xml(json);

  51.     cout << json ;

  52.     cout << endl ;

  53.     cout << xml ;

  54. }

这次我们使用tinyxml2 和nlohmann json 做转换,需要将两者的头文件和源代码文件下载,并在编译中include。

nolhmann json 需要C++ 11 的支持,gcc版本需要在4.7以上。

可以使用下面命令编译:

g++ -std=c++11 xmljson.cpp tinyxml2.cpp -I./

  1. ./a.out

  2. {"appid":"appid-value111111","mch_id":"mch_id-value22222","nonce_str":"nonce_str-value3333333","sign":"sign-value5555555555","transaction_id":"transaction_id-value44444444"}

  3. <xml>

  4. <appid>appid-value111111</appid>

  5. <mch_id>mch_id-value22222</mch_id>

  6. <nonce_str>nonce_str-value3333333</nonce_str>

  7. <sign>sign-value5555555555</sign>

  8. <transaction_id>transaction_id-value44444444</transaction_id>

  9. </xml>



C++常用函数 XML JSON格式转换 https://www.cppentry.com/bencandy.php?fid=49&id=265715

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++ 获取文件大小 下一篇C++ 常用编程--Swap函数有几种写..