加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 1、QMap
    • 2、QVariant
    • 3、QVariantMap
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

一種基于QT應(yīng)用程序封裝JsonRpc2.0協(xié)議請(qǐng)求對(duì)象的便捷方法

2023/10/08
3769
閱讀需 14 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

來(lái)源 | 嵌入式應(yīng)用研究院

之前一直用的是cJSON庫(kù)來(lái)封裝和解析,寫久了感覺實(shí)在太丑,又難維護(hù),于是還是研究下QT原生的QJson是否有更優(yōu)雅的方法來(lái)封裝一些Json對(duì)象,果不其然,通過閱讀QT開發(fā)文檔發(fā)現(xiàn),QT封裝的Json非常強(qiáng)大,其中Json對(duì)象可以有很多種形式,我們看到qjsonobject.h中:

template?<class?Key,?class?T>?class?QMap;
typedef?QMap<QString,?QVariant>?QVariantMap;
template?<class?Key,?class?T>?class?QHash;
typedef?QHash<QString,?QVariant>?QVariantHash;

基于模板創(chuàng)建了QMap和QHash兩種容器類型,我們先來(lái)介紹QMap和QVariantMap的應(yīng)用,在介紹QVariantMap的應(yīng)用之前,先來(lái)了解QMap以及QVariant。

1、QMap

QMap是Qt庫(kù)中的一個(gè)關(guān)聯(lián)容器,它存儲(chǔ)鍵值對(duì),其中每個(gè)鍵都是唯一的。這使得你可以通過鍵值來(lái)快速查找或訪問存儲(chǔ)在QMap中的值。

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

    插入:使用insert()函數(shù)將一個(gè)鍵值對(duì)插入到QMap中。獲取值:使用value()函數(shù)通過鍵來(lái)獲取值。查找:使用find()函數(shù)查找具有給定鍵的鍵值對(duì)。刪除:使用remove()函數(shù)刪除具有給定鍵的鍵值對(duì)。遍歷:使用iterator(如QMapIterator或constIterator)遍歷QMap中的所有鍵值對(duì)。

下面是一個(gè)簡(jiǎn)單的QMap使用例子:

#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()函數(shù)獲取值
????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;
}

運(yùn)行結(jié)果:注意,QMap不保證同義詞的插入順序,即如果插入相同的鍵,第二個(gè)插入的鍵值對(duì)將出現(xiàn)在QMap的末尾。如果需要保持插入順序,可以使用QMap<QString,QList>,其中QList存儲(chǔ)與該鍵關(guān)聯(lián)的值。

2、QVariant

QVariant是一個(gè)可以存儲(chǔ)多種數(shù)據(jù)類型的類,它可以方便地在不同的函數(shù)、類、模塊之間傳遞數(shù)據(jù)。QVariant的用法非常簡(jiǎn)單,只需要使用構(gòu)造函數(shù)、賦值操作符、setValue函數(shù)等方法將數(shù)據(jù)存儲(chǔ)到QVariant對(duì)象中,然后使用toXXX函數(shù)將QVariant對(duì)象轉(zhuǎn)換為指定類型的數(shù)據(jù)。例如:

#include?<QCoreApplication>
#include?<QDebug>
#include?<QVariant>
#include?<QDateTime>

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

????//?存儲(chǔ)數(shù)據(jù)
????QVariant?v1?=?10;?//?存儲(chǔ)整數(shù)
????QVariant?v2?=?"hello";?//?存儲(chǔ)字符串
????QVariant?v3?=?QDateTime::currentDateTime();?//?存儲(chǔ)日期時(shí)間

????//?獲取數(shù)據(jù)
????int?i?=?v1.toInt();?//?將?QVariant?轉(zhuǎn)換為整數(shù)
????QString?s?=?v2.toString();?//?將?QVariant?轉(zhuǎn)換為字符串
????QDateTime?dt?=?v3.toDateTime();?//?將?QVariant?轉(zhuǎn)換為日期時(shí)間

????//?輸出數(shù)據(jù)
????qDebug()?<<?"v1?=?"?<<?i;
????qDebug()?<<?"v2?=?"?<<?s;
????qDebug()?<<?"v3?=?"?<<?dt;

????return?a.exec();
}

運(yùn)行結(jié)果:

3、QVariantMap

QT的開發(fā)者基于QMap及QVariant的優(yōu)點(diǎn),于是開發(fā)衍生出了QVariantMap。QVariantMap是一個(gè)Qt提供的容器類,它可以存儲(chǔ)一組鍵值對(duì),其中鍵是QString類型,值是QVariant類型。QVariant是一個(gè)可以存儲(chǔ)多種數(shù)據(jù)類型的類,包括基本類型、Qt類型和自定義類型。QVariantMap的優(yōu)點(diǎn)是可以方便地使用字符串作為鍵來(lái)訪問或修改值,而不需要像QMap那樣指定鍵的類型。QVariantMap的缺點(diǎn)是它不能保證鍵的順序,也不能存儲(chǔ)重復(fù)的鍵。它也有很多應(yīng)用場(chǎng)景,例如:

    在QML中,可以使用QVariantMap作為C++和JavaScript之間的數(shù)據(jù)交換格式,因?yàn)樗梢宰詣?dòng)轉(zhuǎn)換為JavaScript對(duì)象。在Qt中,可以使用QVariantMap作為JSON對(duì)象的表示方式,因?yàn)樗梢苑奖愕厥褂肣JsonDocument和QJsonObject進(jìn)行互相轉(zhuǎn)換。在Qt中,可以使用QVariantMap作為數(shù)據(jù)庫(kù)查詢的結(jié)果集,因?yàn)樗梢苑奖愕厥褂肣SqlQuery和QSqlRecord進(jìn)行互相轉(zhuǎn)換。在Qt中,可以使用QVariantMap作為配置文件的存儲(chǔ)格式,因?yàn)樗梢苑奖愕厥褂肣Settings進(jìn)行讀寫。

QVariantMap在Json對(duì)象轉(zhuǎn)換之間的應(yīng)用,例如,有一個(gè)JsonRpc2.0的請(qǐng)求對(duì)象:

?{
????jsonrpc:?"2.0",
????id:?1,
????method:?"Set/LedStatus",
????params:?{
????????"color":?"blue",
????????"status":?"on"
????}
?}

編寫一個(gè)程序封裝一個(gè)基于JsonRpc2.0的請(qǐng)求對(duì)象的方法:

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

應(yīng)用主程序調(diào)用:

#include?<QDebug>
#include?<QJsonArray>
#include?<QJsonObject>
#include?<QJsonDocument>
#include?<QCoreApplication>

/*
?*?Rpc結(jié)構(gòu)
?{
????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封裝參數(shù)對(duì)象部分的數(shù)據(jù)結(jié)構(gòu)
????const?QVariantMap?&ParamsObject?=?{
????????????{"color",?"blue"},
????????????{"status",?"on"}
????????};
????QByteArray?JsonStr?=?JsonRpc2ProcotolPacket(15,?"Set/LedStatus",?ParamsObject);
????qDebug()?<<?JsonStr;
????return?a.exec();
}

運(yùn)行結(jié)果:

用起來(lái)簡(jiǎn)直不要太爽!

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
ASEM1-16.000MHZ-LC-T 1 Abracon Corporation MEMS OSC XO 16.0000MHZ CMOS SMD
$1.63 查看
CAT24C04WI-GT3 1 Rochester Electronics LLC 512X8 I2C/2-WIRE SERIAL EEPROM, PDSO8, 0.150 INCH, GREEN, MS-012, SOIC-8
$0.21 查看
LTST-C190CKT 1 Lite-On Semiconductor Corporation Single Color LED, Red, Water Clear, 1.1mm,

ECAD模型

下載ECAD模型
$0.21 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

本科畢業(yè)于華南理工大學(xué),現(xiàn)美國(guó)卡羅爾工商管理碩士研究生在讀,曾就職于世界名企偉易達(dá)、聯(lián)發(fā)科技等,多年嵌入式產(chǎn)品開發(fā)經(jīng)驗(yàn),在智能玩具、安防產(chǎn)品、平板電腦、手機(jī)開發(fā)有豐富的實(shí)戰(zhàn)開發(fā)經(jīng)驗(yàn),現(xiàn)任深圳市云之手科技有限公司副總經(jīng)理、研發(fā)總工程師。