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

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

<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格式的自由转换。

#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以上。

可以使用下面命令编译:

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

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

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

数学<math.h>:

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);

字符<ctype.h>:

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

字符串<string.h>:

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

内存操作<memory.h>:

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

类型转换<stdlib.h>:

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

时间<time.h>:

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

其他<stdlib.h>:

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

keep going

到此这篇关于C++常用函数之XML JSON格式转换问题的文章就介绍到这了,更多相关c++ xml json格式转换内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++通过msxml调用webservice示例分享

    其实没什么难度,只是要调发送的xml格式,建议使用SoapUI调好,再粘到项目中 就是使用 msxml因为是mfc的东西,要在项目中设置在共享DLL中使用MFC 还有要在调用的服务后面加?wsdl解释成xml格式 代码 webservice 复制代码 代码如下: using System;using System.Data;using System.Web;using System.Collections;using System.Web.Services;using System.Web.Se

  • C++解析Json的方法详解【jsoncpp】

    本文实例讲述了C++解析Json的方法.分享给大家供大家参考,具体如下: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,和xml类似,本文主要对VS2008中使用Jsoncpp解析json的方法做一下记录. Jsoncpp是个跨平台的开源库,下载地址:http://sourceforge.net/projects/jsoncpp/,我下载的是v0.5.0,压缩包大约104K. 方法一:使用Jsoncpp生成的lib文件 解压上面下载的Jsoncpp

  • C/C++利用libxml2高效输出XML大文件详解

    前言 Libxml2 是一个xml c语言版的解析器,本来是为Gnome项目开发的工具,是一个基于MIT License的免费开源软件.它除了支持c语言版以外,还支持c++.PHP.Pascal.Ruby.Tcl等语言的绑定,能在Windows.Linux.Solaris.MacOsX等平台上运行.功能还是相当强大的,相信满足一般用户需求没有任何问题. libxml2常用数据类型 xmlChar是libxml2中的字符类型,在库中的所有字符,字符串都是基于这个数据类型的. xmlChar*是指针

  • tinyxml 常用的C++ XML解析器非常优秀

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译.这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树. DOM模型即文档对象模型,是将整个文档分成多个元素(如书.章.节.段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包

  • C++读入XML文件示例

    最近要做一个VRP的算法,测试集都是放在Xml文件中,而我的算法使用C++来写,所以需要用C++来读取Xml文件. 在百度上搜"C++读取Xml文件",可以出来很多博客,大多数是关于tinyXml的,所以这篇博文也是讲述如何用tinyXML来读取XML文件. tinyXml是一个免费开源的C++库,可以到官网上下载:https://sourceforge.net/projects/tinyxml/. 下载下来解压之后,可以看到下面这些文件: 我是在windows下用VS来写C++的,按

  • c++中的string常用函数用法总结

    标准c++中string类函数介绍 注意不是CString之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要.我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?).我们尽可以把它看成是C++的基本数据类型. 好了,进入正题---首先,为了在我们的程序中使用string类型,我们必须包含头文件 <string>

  • C++调用迅雷接口解析XML下载功能(迅雷下载功能)

    迅雷下载库的网址:http://thunderplatform.xunlei.com 复制代码 代码如下: // FileName: Download.h#pragma once#include "lib\XLDownload.h"#include "lib\XLError.h"#include <vector> // 下载队列的大小,决定同时开启下载线程的数量const int LIMIT = 2; struct Down{    // 解析出来的下载

  • 基于C++ bitset常用函数及运算符(详解)

    C++ bitset--高端压位卡常题必备STL ------------------------------------------------------------ 以下内容翻译自cplusplus.com,极大地锻炼了我的英语能力. bitset存储二进制数位. bitset就像一个bool类型的数组一样,但是有空间优化--bitset中的一个元素一般只占1 bit,相当于一个char元素所占空间的八分之一. bitset中的每个元素都能单独被访问,例如对于一个叫做foo的bitset,

  • 详解C++的JSON静态链接库JsonCpp的使用方法

    JsonCpp部署方法: 在http://sourceforge.net/projects/jsoncpp/中下载最新版本的jsoncpp库源码. 之后将jsoncpp-src-版本号-tar.gz解压出来,打开makefiles中的jsoncpp.sln进行编译,之后build文件夹下的vs71\debug\lib_json中会有一个.lib静态链接库. JsonCpp主要包含三种类型的class:Value Reader Writer. jsoncpp中所有对象.类名都在namespace

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

    数据格式在编程里面很常见,不同的系统都会有自己的标准.因为给有各的定义,每次做第三方开发系统对接的时候数据格式标准都是头疼的事情. 在开发过程中比较常见的比如有Json.XML.Key-Value等.这里我们就先看看Json和XML.两者的转换有很多开源的代码可以使用,而且也很完善,可以参考xml2json.xsltjson. XML在Json出现前应用很广泛,灵活性好,应用语言也没有限制,发展了这么长时间后xml标准已经很臃肿.这里可以查看XML的标准XML标准.在C++里面解析和操作XML的

  • Python基于pandas实现json格式转换成dataframe的方法

    本文实例讲述了Python基于pandas实现json格式转换成dataframe的方法.分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- #!python3 import re import json from bs4 import BeautifulSoup import pandas as pd import requests import os from pandas.io.json import json_normalize class image_str

  • C#实现json格式转换成对象并更换key的方法

    本文实例讲述了C#实现json格式转换成对象并更换key的方法.分享给大家供大家参考.具体分析如下: 由于是不标准的序列化对象类型,因此你无法通过标准的反序列化类来实现,需要自定义一个序列化类或者简单点,直接自定义一个方法解析Json数据.解析后的数据用Dictionary来存放. string str = "{\"name\": \"甄嬛体\",\"2012-05-04 14:59\": \"5724\"}&quo

  • Python实现把json格式转换成文本或sql文件

    python如何将json格式的数据快速的转化成指定格式的数据呢?或者转换成sql文件? 下面的例子是将json格式的数据准换成以#_#分割的文本数据,也可用于生成sql文件. [root@bogon tutorial]# vi json2txt.py #-*- coding: UTF-8 -*- import json data = [] with open('./tencent_test.json') as f: for line in f: data.append(json.loads(l

  • Java的JSON格式转换库GSON的初步使用笔记

    现在已经有一些能将Java对象转换成JSON的开源项目了.但是大多数项目都要求你在类文件中加入Java注解,而当你无法改动源代码的时候这是无法做到的.并且它们也不支持Java泛型.但是Gson却将这两点作为自己非常重要的设计目标. 特点: 使用toJson()和fromJson()方法,就可以非常容易的完成Java对象到JSON的相互转换. 能将预先存在的无法修改的对象与JSON互相转换. 支持Java泛型的使用. 允许对象的个性化表达形式(representation). 支持各种复杂(拥有深

  • PHP封装XML和JSON格式数据接口操作示例

    本文实例讲述了PHP封装XML和JSON格式数据接口操作.分享给大家供大家参考,具体如下: 使用PHP开发app后端的接口时,我们需要返回数据,最常用的就是XML和JSON格式的数据,那么样返回呢? 1.JSON json数据是最容制造的,只要使用php自带的json_encode()函数就可以简单的制作出json数据了 2.XML xml数据就要复杂一点了,让我们看一下xml数据的格式 那么怎样构造呢? 3.制作生产接口数据的类 <?php //定义生成接口数据类 class Api { /*

  • javascript解析ajax返回的xml和json格式数据实例详解

    本文实例讲述了javascript解析ajax返回的xml和json格式数据.分享给大家供大家参考,具体如下: 写个例子,以备后用 一.JavaScript 解析返回的xml格式的数据: 1.javascript版本的ajax发送请求 (1).创建XMLHttpRequest对象,这个对象就是ajax请求的核心,是ajax请求和响应的信息载体,单是不同浏览器创建方式不同 (2).请求路径 (3).使用open方法绑定发送请求 (4).使用send() 方法发送请求 (5).获取服务器返回的字符串

  • Python中xml和json格式相互转换操作示例

    本文实例讲述了Python中xml和json格式相互转换操作.分享给大家供大家参考,具体如下: Python中xml和json格式是可以互转的,就像json格式转Python字典对象那样. xml格式和json格式互转用到的xmltodict库 安装xmltodict库 C:\Users\Administrator>pip3 install xmltodict Collecting xmltodict   Downloading xmltodict-0.11.0-py2.py3-none-any

  • JavaScript对象与JSON格式的转换及JSON.stringify和JSON.parse的使用方法

    目录 JSON处理 JSON.stringify stringify的限制 排除和替换 映射函数 格式化使用的空格数量 自定义toJSON方法 JSON.parse 使用reviver 总结 JSON处理 JSON(JavaScript Object Notation)是JavaScript表达值和对象的通用数据格式,其本质就是符合一定规范的字符串.由于JSON的优良特性,非常容易和其他语言进行数据交换,尤其在前后端交互方面.即使我们前端使用JavaScript,后端使用Java/PHP/Pyt

  • JS对象与json字符串格式转换实例

    本文实例讲述了JS对象与json字符串格式转换的实现方法,分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <head>     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />     <title></title>     <script type="text/javascript"&g

随机推荐