前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一种基于QT应用程序封装JsonRpc2.0协议请求对象的便捷方法

一种基于QT应用程序封装JsonRpc2.0协议请求对象的便捷方法

作者头像
杨源鑫
发布2023-10-09 13:02:54
1890
发布2023-10-09 13:02:54
举报
文章被收录于专栏:嵌入式开发圈嵌入式开发圈

整理&排版 | 嵌入式应用研究院

之前一直用的是cJSON库来封装和解析,写久了感觉实在太丑,又难维护,于是还是研究下QT原生的QJson是否有更优雅的方法来封装一些Json对象,果不其然,通过阅读QT开发文档发现,QT封装的Json非常强大,其中Json对象可以有很多种形式,我们看到qjsonobject.h中:

代码语言:javascript
复制
template <class Key, class T> class QMap;
typedef QMap<QString, QVariant> QVariantMap;
template <class Key, class T> class QHash;
typedef QHash<QString, QVariant> QVariantHash;

基于模板创建了QMap和QHash两种容器类型,我们先来介绍QMap和QVariantMap的应用,在介绍QVariantMap的应用之前,先来了解QMap以及QVariant。

1、QMap

QMap是Qt库中的一个关联容器,它存储键值对,其中每个键都是唯一的。这使得你可以通过键值来快速查找或访问存储在QMap中的值。

以下是一些QMap的基本操作:

  • 插入:使用insert()函数将一个键值对插入到QMap中。
  • 获取值:使用value()函数通过键来获取值。
  • 查找:使用find()函数查找具有给定键的键值对。
  • 删除:使用remove()函数删除具有给定键的键值对。
  • 遍历:使用iterator(如QMapIterator或constIterator)遍历QMap中的所有键值对。

下面是一个简单的QMap使用例子:

代码语言:javascript
复制
#include <QCoreApplication>
#include <QDebug>
#include <QMap>

int main(int argc, char *argv[])
{
    QMap<QString, int> map;
    map.insert("One", 1);
    map.insert("Two", 2);
    map.insert("Three", 3);

    // 使用value()函数获取值
    int one = map.value("One");
    qDebug() << "one:" << one;

    // 使用constIterator遍历QMap
    QMap<QString, int>::const_iterator i;
    for (i = map.constBegin(); i != map.constEnd(); ++i) {
        qDebug() << "Key: " << i.key() << ", Value: " << i.value();
    }

    return 0;
}

运行结果:

注意,QMap不保证同义词的插入顺序,即如果插入相同的键,第二个插入的键值对将出现在QMap的末尾。如果需要保持插入顺序,可以使用QMap<QString,QList>,其中QList存储与该键关联的值。

2、QVariant

QVariant是一个可以存储多种数据类型的类,它可以方便地在不同的函数、类、模块之间传递数据。QVariant的用法非常简单,只需要使用构造函数、赋值操作符、setValue函数等方法将数据存储到QVariant对象中,然后使用toXXX函数将QVariant对象转换为指定类型的数据。例如:

代码语言:javascript
复制
#include <QCoreApplication>
#include <QDebug>
#include <QVariant>
#include <QDateTime>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 存储数据
    QVariant v1 = 10; // 存储整数
    QVariant v2 = "hello"; // 存储字符串
    QVariant v3 = QDateTime::currentDateTime(); // 存储日期时间

    // 获取数据
    int i = v1.toInt(); // 将 QVariant 转换为整数
    QString s = v2.toString(); // 将 QVariant 转换为字符串
    QDateTime dt = v3.toDateTime(); // 将 QVariant 转换为日期时间

    // 输出数据
    qDebug() << "v1 = " << i;
    qDebug() << "v2 = " << s;
    qDebug() << "v3 = " << dt;

    return a.exec();
}

运行结果:

3、QVariantMap

QT的开发者基于QMap及QVariant的优点,于是开发衍生出了QVariantMap。QVariantMap是一个Qt提供的容器类,它可以存储一组键值对,其中键是QString类型,值是QVariant类型。QVariant是一个可以存储多种数据类型的类,包括基本类型、Qt类型和自定义类型。QVariantMap的优点是可以方便地使用字符串作为键来访问或修改值,而不需要像QMap那样指定键的类型。QVariantMap的缺点是它不能保证键的顺序,也不能存储重复的键。它也有很多应用场景,例如:

  • 在QML中,可以使用QVariantMap作为C++和JavaScript之间的数据交换格式,因为它可以自动转换为JavaScript对象。
  • 在Qt中,可以使用QVariantMap作为JSON对象的表示方式,因为它可以方便地使用QJsonDocument和QJsonObject进行互相转换。
  • 在Qt中,可以使用QVariantMap作为数据库查询的结果集,因为它可以方便地使用QSqlQuery和QSqlRecord进行互相转换。
  • 在Qt中,可以使用QVariantMap作为配置文件的存储格式,因为它可以方便地使用QSettings进行读写。

QVariantMap在Json对象转换之间的应用,例如,有一个JsonRpc2.0的请求对象:

代码语言:javascript
复制
 {
    jsonrpc: "2.0",
    id: 1,
    method: "Set/LedStatus",
    params: {
        "color": "blue",
        "status": "on"
    }
 }

编写一个程序封装一个基于JsonRpc2.0的请求对象的方法:

代码语言:javascript
复制
QByteArray JsonRpc2ProcotolPacket(int Id, QString Method, const QVariantMap &_Params)
{
    QJsonObject RootObject;
    QJsonObject Params = QVariant(_Params).toJsonObject();
    RootObject.insert("jsonrpc", "2.0");
    RootObject.insert("id", Id);
    RootObject.insert("method", Method);
    RootObject.insert("params", Params);
    QJsonDocument JsonDoc(RootObject);
    return JsonDoc.toJson();
}

应用主程序调用:

代码语言:javascript
复制
#include <QDebug>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonDocument>
#include <QCoreApplication>

/*
 * Rpc结构
 {
    jsonrpc: "2.0",
    id: 1,
    method: "Set/LedStatus",
    params: {
        "color": "blue",
        "status": "on"
    }
 }
*/

QByteArray JsonRpc2ProcotolPacket(int Id, QString Method, const QVariantMap &_Params)
{
    QJsonObject RootObject;
    QJsonObject Params = QVariant(_Params).toJsonObject();
    RootObject.insert("jsonrpc", "2.0");
    RootObject.insert("id", Id);
    RootObject.insert("method", Method);
    RootObject.insert("params", Params);
    QJsonDocument JsonDoc(RootObject);
    return JsonDoc.toJson();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    //使用QVariantMap封装参数对象部分的数据结构
    const QVariantMap &ParamsObject = {
            {"color", "blue"},
            {"status", "on"}
        };
    QByteArray JsonStr = JsonRpc2ProcotolPacket(15, "Set/LedStatus", ParamsObject);
    qDebug() << JsonStr;
    return a.exec();
}

运行结果:

用起来简直不要太爽!

往期精彩

Keil MDK软件包(pack)下载的几种方法

手把手教你在Keil MDK中使用GCC编译器工具链

分享一个在Keil开发环境中配置代码格式化工具Astyle(美化代码风格)

Keil MDK 将升级为 Keil Studio,你想要的黑色主题来了,附手把手使用教程

Keil MDK的一些推荐功能(编码格式、自动保存、代码提示、动态语法检查、多核编译)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-10-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式应用研究院 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、QMap
  • 2、QVariant
  • 3、QVariantMap
  • 往期精彩
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档