C++常用函数之XML JSON格式转换问题 - 网站

C++常用函数之XML JSON格式转换问题

分类:C语言 · 发布时间:2021-10-06 18:08 · 阅读:5931

XML在Json出现前应用很广泛,灵活性好,应用语言也没有限制,发展了这么长时间后xml标准已经很臃肿。这篇文章主要介绍了C++常用函数之XML JSON格式转换问题,需要的朋友可以参考下

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

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

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

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

XML2Json & Json2XML

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

  appid-value111111mch_id-value22222nonce_str-value3333333transaction_id-value44444444sign-value5555555555

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

 #include  #include  #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 = "\ appid-value111111\ mch_id-value22222\ nonce_str-value3333333\ transaction_id-value44444444\ sign-value5555555555\ " ; 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以上。

可以使用下面命令编译:

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"}  appid-value111111mch_id-value22222nonce_str-value3333333sign-value5555555555transaction_id-value44444444

C++常用函数 XML JSON格式转换https://www.cppentry.com/benc...

开发资料https://www.cppentry.com

知识点扩展:C++常用的系统函数

数学

1 三角函数

double sin (double);
double cos (double);
double tan (double);

2 反三角函数

double asin (double); 结果介于[-PI/2, PI/2]
double acos (double); 结果介于[0, PI]
double atan (double); 反正切(主值), 结果介于[-PI/2, PI/2]
double atan2 (double, double); 反正切(整圆值), 结果介于[-PI/2, PI/2]

3 双曲三角函数

double sinh (double);
double cosh (double);
double tanh (double);

4 指数与对数

double exp (double x); e的x次幂
double pow (double x, double y); x的y次幂
double sqrt (double);
double log (double x); 以e为底的对数,即ln x
double log10 (double x);log10(x) 以10为底。

没有以2为底的函数但是可以用换底公式解 决:log2(N)=log10(N)/log10(2)

5 取整

double ceil (double); 不小于x的最小整数
double floor (double); 不大于x的最大整数

6 绝对值

int abs(int);整型
long labs(long);长整型
double fabs (double);浮点型

7 标准化浮点数

double frexp (double f, int p); 标准化浮点数, f = x 2^p, 已知f求x, p ( x介于[0.5, 1] )
double ldexp (double x, int p); 与frexp相反, 已知x, p求f

8 取整与取余

double modf (double, double*); 将参数的整数部分通过指针回传, 返回小数部分
double fmod (double, double); 返回两参数相除的余数

9.平方根

double sqrt(double x);

字符

int isalpha(int c);c是否为字母
int isdigit(int c);c是否为数字
int tolower(int c);将c转换为小写字母
int toupper(int c);将c转换为大写字母

字符串:

char strcpy(char sl,char s2);将字符串s2复制给s1,即覆盖
unsigned strlen(char sr);求字符串str长度

内存操作:

void memcpy(void d,void *s,int c);将s指向的内存区域的c个字节复制到d指向的区域

类型转换:

int atoi(char s);将字符串转化为整数
char itoa(int v,char *s,int x);将整数v按x进制转成字符串s

时间:

time_t time(time_t *timer);返回1970/1/1零点到目前的秒数

其他:

srand(unsigned seed);设置随机数的种子
int rand();产生0-RAND_MAX的随机数
exit(int);终止正在执行的程序

keep going

标签:
c++ xml json 格式 转换

相关文章

C/C++预处理浅析使用形式

预处理是指在进行编译的词法扫描和语法分析之前所作的工作。预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置。处理完毕自动进入对源程序的编译。C/C++中的预处理主要包含三种:文件包含、宏定义、条件编译

C++中的字符串编码处理方法

这篇文章主要介绍了C++中的字符串编码处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

C++中的强制类型转换操作详解

C++中提供了四种强制类型转换技术:static_cast、dynamic_cast、reinterpret_cast和const_cast。这些技术能够在需要时将一种类型转换为另一种类型,但需要注意它们的适用条件和安全性。程序员需要根据具体情况选择合适的强制类型转换方式,以确保程序的正确性和可靠性

QT+OpenGL实现简单图形的绘制

这篇文章主要为大家详细介绍了如何利用QT和OpenGL实现简单图形的绘制,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下

C语言之结构体定义 typedef struct 用法详解和用法小结

这篇文章主要介绍了C语言的结构体定义typedef struct用法详解和用法小结,typedef是类型定义,typedef struct 是为了使用这个结构体方便,感兴趣的同学可以参考阅读

返回分类 返回首页