使用XPACK库实现结构体,JSON,XML三者数据互相转换

XPACK库简介

  1. 核心能力

    • 实现C++结构体与JSON/XML/BSON/YAML等格式双向转换

    • 支持MySQL/SQLite数据库ORM映射,简化数据持久化操作

    • 零依赖头文件库设计,仅需包含头文件即可使用

  2. 高级特性

    • 完整STL容器支持(vector/set/map等)及嵌套结构处理

    • 提供位域处理、类继承支持、枚举类型转换能力

    • 支持自定义编解码扩展机制,满足特殊场景需求

    • 通过XPACK宏实现非侵入式字段声明(如XPACK(O(name,age))

  3. 应用价值

    • 简化数据序列化/反序列化流程,提升开发效率

    • 宏编程教学典范,展示高阶宏技巧和SFINAE实现方法

    • 适用于物联网设备通信、配置文件解析等场景

XPACK库git地址

GitCode - 全球开发者的开源社区,开源代码托管平台GitCode是面向全球开发者的开源社区,包括原创博客,开源代码托管,代码协作,项目管理等。与开发者社区互动,提升您的研发效率和质量。https://gitcode.com/Universal-Tool/d19ba.git

Qt中使用XPACK库

1.使用Qt封装一个结构体与JSON数据,结构体与XML数据互转模块XmlJsonStructExchgMod;

2.使用Qt编写一个测试程序,在测试程序中使用XmlJsonStructExchgMod模块实现数据互转。

        模块的对外接口函数

#ifndef XMLJSONSTRUCTEXCHGMOD_H
#define XMLJSONSTRUCTEXCHGMOD_H

#include <QtCore/qglobal.h>
#include "xpack/json.h"
#include "xpack/xml.h"
#include <iostream>
using namespace std;
#if defined(XMLJSONSTRUCTEXCHGMOD_LIBRARY)
#  define XMLJSONSTRUCTEXCHGMOD_EXPORT Q_DECL_EXPORT
#else
#  define XMLJSONSTRUCTEXCHGMOD_EXPORT Q_DECL_IMPORT
#endif
class XMLJSONSTRUCTEXCHGMOD_EXPORT XmlJsonStructExchgMod
{
public:
    XmlJsonStructExchgMod();
    ~XmlJsonStructExchgMod();
    template<class T>
    static void JsonToStru(const std::string &data,T &val )
    {
        xpack::json::decode(data, val);
    }
    template<class T>
    static std::string StruToJson(const T &val)
    {
        return xpack::json::encode(val);
    }
    template<class T>
    static void XmlToStru(const std::string &data, T &val)
    {
        xpack::xml::decode(data, val);
    }
    template<class T>
    static std::string StruToXml(const T &val)
    {
        return xpack::xml::encode(val,"root");
    }
};

#endif // XMLJSONSTRUCTEXCHGMOD_H

        自定义头文件的XPACK化编写


#ifndef BASE_H
#define BASE_H
#include "xpack/xpack.h"
#include <iostream>
using namespace std;
struct STransmissionBase
{
    string id;//消息ID
    string name;//消息命令名称
    string type="01";//命令类型
    int result=0;//命令结果码
    XPACK(O(id,name,type,result))
};
template <typename S>
struct STransmission:public STransmissionBase
{
    S params;
    XPACK(I(STransmissionBase),O(params))
};
struct SLoginResp{
    string cuId;
    int keepAlivePeriod;
    string currentTime;

    XPACK(O(cuId,keepAlivePeriod,currentTime))
};
struct SDepURL
{
    string id;
    string name;
    string parentId;
    string remark;
    XPACK(O(id,name,parentId,remark))
};

struct SGroup
{
    vector<SDepURL> URL;
    XPACK(O(URL))
};
//登录请求
struct SLoginReq{
    string domainId;
    string cuUserId;
    string cuPassword;
    string cuIp;
    string cuPort;
    string version;

    string sysNodeId;
    string manufacturerId;
    string manufacturerName;
    string protocolVersion;
    int isFirstLogin;

    XPACK(O(domainId,cuUserId, cuPassword,cuIp,cuPort,version,sysNodeId,manufacturerId,manufacturerName,protocolVersion,isFirstLogin))
};
#endif // BASE_H

        测试程序中的main函数编写

#include <QCoreApplication>
#include "xmljsonstructexchgmod.h"
#include "base.h"
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    SDepURL dep,dep1;
    dep.id = "210101";
    dep.name ="cam1";
    dep.remark = "gun cam";
    dep.parentId = "2101";
    dep1.id = "210102";
    dep1.name ="cam2";
    dep1.remark = "ball cam";
    dep1.parentId = "2101";
#if 0
    STransmission<SGroup> listInfo,listInfo1;
    listInfo.id = "0x03030102";
    listInfo.name = "getDepList";
    listInfo.result = 0;
    listInfo.type = "02";
    listInfo.params.URL.push_back(dep);
    listInfo.params.URL.push_back(dep1);
#else
    SGroup group,group1;
    group.URL.push_back(dep);
    group.URL.push_back(dep1);
#endif
#if 1
    string str = XmlJsonStructExchgMod::StruToJson(group);
    qDebug() << "json str:" << str.data();
    XmlJsonStructExchgMod::JsonToStru(str,group1);
    qDebug() << "list size:"<< group1.URL.size();

    STransmission<SLoginReq> req;
    string str1 ="{\"id\":\"0x03030101\",\"name\":\"CuRegister\",\"type\":\"01\",\"result\":0,\"params\":{\"domainId\":\"210201A001000100\",\"cuUserId\":\"2102013008A09901\",\"cuPassword\":\"202cb962ac59075b964b07152d234b70\",\"cuIp\":\"192.168.22.53\",\"cuPort\":\"11111\",\"version\":\"1.0\",\"sysNodeId\":\"\",\"manufacturerId\":\"\",\"manufacturerName\":\"\",\"protocolVersion\":\"\",\"isFirstLogin\":0}}";
    XmlJsonStructExchgMod::JsonToStru(str1,req);
    qDebug() << "id:"<< req.id.data() <<" name:"<< req.name.data();
#else
   string str = XmlJsonStructExchgMod::StruToXml(group);
   qDebug() << "xml str:" << str.data();
   XmlJsonStructExchgMod::XmlToStru(str,group1);
   qDebug() << "list size:" << group1.URL.size();
#endif
    return a.exec();
}

Demo资源链接

https://download.csdn.net/download/kk821521286/90952696

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值