之前一直用的是cJSON庫(kù)來(lái)封裝和解析,寫(xiě)久了感覺(jué)實(shí)在太丑,又難維護(hù),于是還是研究下QT原生的QJson是否有更優(yōu)雅的方法來(lái)封裝一些Json對(duì)象,果不其然,通過(guò)閱讀QT開(kāi)發(fā)文檔發(fā)現(xiàn),QT封裝的Json非常強(qiáng)大,其中Json對(duì)象可以有很多種形式,我們看到qjsonobject.h中:
templateclassQMap; typedefQMapQVariantMap; templateclassQHash; typedefQHashQVariantHash; ,>,>
基于模板創(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è)鍵都是唯一的。這使得你可以通過(guò)鍵值來(lái)快速查找或訪問(wèn)存儲(chǔ)在QMap中的值。
以下是一些QMap的基本操作:
插入:使用insert()函數(shù)將一個(gè)鍵值對(duì)插入到QMap中。
獲取值:使用value()函數(shù)通過(guò)鍵來(lái)獲取值。
查找:使用find()函數(shù)查找具有給定鍵的鍵值對(duì)。
刪除:使用remove()函數(shù)刪除具有給定鍵的鍵值對(duì)。
遍歷:使用iterator(如QMapIterator或constIterator)遍歷QMap中的所有鍵值對(duì)。
下面是一個(gè)簡(jiǎn)單的QMap使用例子:
#include #include #include intmain(intargc,char*argv[]) { QMapmap; map.insert("One",1); map.insert("Two",2); map.insert("Three",3); //使用value()函數(shù)獲取值 intone=map.value("One"); qDebug()<"one:"?<,>
運(yùn)行結(jié)果:
注意,QMap不保證同義詞的插入順序,即如果插入相同的鍵,第二個(gè)插入的鍵值對(duì)將出現(xiàn)在QMap的末尾。如果需要保持插入順序,可以使用QMap,其中QList存儲(chǔ)與該鍵關(guān)聯(lián)的值。,qlist>
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 #include #include #include intmain(intargc,char*argv[]) { QCoreApplicationa(argc,argv); //存儲(chǔ)數(shù)據(jù) QVariantv1=10;//存儲(chǔ)整數(shù) QVariantv2="hello";//存儲(chǔ)字符串 QVariantv3=QDateTime::currentDateTime();//存儲(chǔ)日期時(shí)間 //獲取數(shù)據(jù) inti=v1.toInt();//將QVariant轉(zhuǎn)換為整數(shù) QStrings=v2.toString();//將QVariant轉(zhuǎn)換為字符串 QDateTimedt=v3.toDateTime();//將QVariant轉(zhuǎn)換為日期時(shí)間 //輸出數(shù)據(jù) qDebug()<"v1?=?"?<
運(yùn)行結(jié)果:
3、QVariantMap
QT的開(kāi)發(fā)者基于QMap及QVariant的優(yōu)點(diǎn),于是開(kāi)發(fā)衍生出了QVariantMap。QVariantMap是一個(gè)Qt提供的容器類,它可以存儲(chǔ)一組鍵值對(duì),其中鍵是QString類型,值是QVariant類型。QVariant是一個(gè)可以存儲(chǔ)多種數(shù)據(jù)類型的類,包括基本類型、Qt類型和自定義類型。QVariantMap的優(yōu)點(diǎn)是可以方便地使用字符串作為鍵來(lái)訪問(wèn)或修改值,而不需要像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)行讀寫(xiě)。
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" } }
編寫(xiě)一個(gè)程序封裝一個(gè)基于JsonRpc2.0的請(qǐng)求對(duì)象:
QByteArrayJsonRpc2ProcotolPacket(intId,QStringMethod,constQVariantMap&_Params) { QJsonObjectRootObject; QJsonObjectParams=QVariant(_Params).toJsonObject(); RootObject.insert("jsonrpc","2.0"); RootObject.insert("id",Id); RootObject.insert("method",Method); RootObject.insert("params",Params); QJsonDocumentJsonDoc(RootObject); returnJsonDoc.toJson(); }
應(yīng)用主程序調(diào)用:
#include #include #include #include #include /* *Rpc結(jié)構(gòu) { jsonrpc:"2.0", id:1, method:"Set/LedStatus", params:{ "color":"blue", "status":"on" } } */ QByteArrayJsonRpc2ProcotolPacket(intId,QStringMethod,constQVariantMap&_Params) { QJsonObjectRootObject; QJsonObjectParams=QVariant(_Params).toJsonObject(); RootObject.insert("jsonrpc","2.0"); RootObject.insert("id",Id); RootObject.insert("method",Method); RootObject.insert("params",Params); QJsonDocumentJsonDoc(RootObject); returnJsonDoc.toJson(); } intmain(intargc,char*argv[]) { QCoreApplicationa(argc,argv); //使用QVariantMap封裝參數(shù)對(duì)象部分的數(shù)據(jù)結(jié)構(gòu) constQVariantMap&ParamsObject={ {"color","blue"}, {"status","on"} }; QByteArrayJsonStr=JsonRpc2ProcotolPacket(15,"Set/LedStatus",ParamsObject); qDebug()<
運(yùn)行結(jié)果:
用起來(lái)簡(jiǎn)直不要太爽!
,>,>,>,>
審核編輯:劉清
-
存儲(chǔ)器
+關(guān)注
關(guān)注
38文章
7528瀏覽量
164345 -
javascript
+關(guān)注
關(guān)注
0文章
525瀏覽量
53945 -
C++語(yǔ)言
+關(guān)注
關(guān)注
0文章
147瀏覽量
7027
原文標(biāo)題:一種基于QT應(yīng)用程序封裝JsonRpc2.0協(xié)議請(qǐng)求對(duì)象的便捷方法
文章出處:【微信號(hào):嵌入式應(yīng)用研究院,微信公眾號(hào):嵌入式應(yīng)用研究院】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
關(guān)于Qt的一些問(wèn)題,希望大家多多指教!
是否有一種方法來(lái)確定GPIF接口在等待GPIF主機(jī)的數(shù)據(jù)時(shí)干還是空
有什么好的方法來(lái)實(shí)現(xiàn)對(duì)某個(gè)信號(hào)的延時(shí)嗎?
是否有任何方法來(lái)打開(kāi)/關(guān)閉由復(fù)雜I/O產(chǎn)生的PWM信號(hào)?
是否可以在比特流的開(kāi)頭保留一些固定的地址空間來(lái)存儲(chǔ)一些易失性用戶數(shù)據(jù)?
如何通過(guò)使用gm/Id的方法來(lái)簡(jiǎn)化設(shè)計(jì)運(yùn)放?
JSON是什么?如何去創(chuàng)建一種JSON?
以一種更優(yōu)雅的方式去實(shí)現(xiàn)一個(gè)Verilog版的狀態(tài)機(jī)
軟件是否有安全的方法來(lái)檢測(cè)運(yùn)行軟件的是哪個(gè)MCU?
是否有適當(dāng)/安全的方法來(lái)取消初始化FS26?
軟件驅(qū)動(dòng)程序是否有一種相當(dāng)簡(jiǎn)單的方法來(lái)檢測(cè)安裝了哪個(gè)rtc設(shè)備?
充電的控制方法有哪些?
分享一些相對(duì)簡(jiǎn)單的方法來(lái)提升自己的數(shù)據(jù)安全性
如何使用簡(jiǎn)單的方法來(lái)監(jiān)控打印機(jī)是否仍在運(yùn)行
![如何使用簡(jiǎn)單的<b class='flag-5'>方法來(lái)</b>監(jiān)控打印機(jī)<b class='flag-5'>是否</b>仍在運(yùn)行](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
JSON的使用方法
![<b class='flag-5'>JSON</b>的使用<b class='flag-5'>方法</b>](https://file1.elecfans.com/web2/M00/AB/9A/wKgaomVAvbmAUG7EAALpjoWWef4676.jpg)
評(píng)論