那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

QT原生的QJson是否有更優(yōu)雅的方法來(lái)封裝一些Json對(duì)象

嵌入式應(yīng)用研究院 ? 來(lái)源:嵌入式應(yīng)用研究院 ? 作者:楊源鑫 ? 2023-10-08 09:26 ? 次閱讀

之前一直用的是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()<,>

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

12a4a38c-6519-11ee-939d-92fbcf53809c.png

注意,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()<

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

12c7df14-6519-11ee-939d-92fbcf53809c.png

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é)果:

12e30096-6519-11ee-939d-92fbcf53809c.png

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






審核編輯:劉清

,>,>,>,>
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(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)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    關(guān)于Qt一些問(wèn)題,希望大家多多指教!

    下方便?比如,在個(gè)button上右擊,linux下沒(méi)有反應(yīng),無(wú)法改變對(duì)象的名字,按住alt+shift+r,窗口也不會(huì)預(yù)覽。同時(shí)一些漢字也不能輸入等等。是我不會(huì)用,沒(méi)有添加什么庫(kù),還是真的是在windows下方便,求指教,新人
    發(fā)表于 03-21 22:01

    是否一種方法來(lái)確定GPIF接口在等待GPIF主機(jī)的數(shù)據(jù)時(shí)干還是空

    我用GPIF作為個(gè)32位奴隸FIFO與2位尋址。我想知道是否一種方法來(lái)確定GPIF接口在等待GPIF主機(jī)的數(shù)據(jù)時(shí)“干”還是空。 以上來(lái)自于百度翻譯 以下為原文I am using
    發(fā)表于 05-27 14:25

    什么好的方法來(lái)實(shí)現(xiàn)對(duì)某個(gè)信號(hào)的延時(shí)嗎?

    在設(shè)計(jì)中, 往往需要對(duì)某個(gè)信號(hào)做定(任意長(zhǎng))的延時(shí), 有沒(méi)有好的方法來(lái)實(shí)現(xiàn)?而不是采用類似移位寄存器的方法來(lái)延時(shí).
    發(fā)表于 09-19 04:23

    是否任何方法來(lái)打開(kāi)/關(guān)閉由復(fù)雜I/O產(chǎn)生的PWM信號(hào)?

    Hi-ALL,是否任何方法來(lái)打開(kāi)/關(guān)閉由復(fù)雜I/O產(chǎn)生的PWM信號(hào)?旦I/O由CYU3PGPIOSETFixCuffic()配置,它就開(kāi)始生成信號(hào),但是如果我想停止并恢復(fù)它呢?我只
    發(fā)表于 09-29 06:58

    是否可以在比特流的開(kāi)頭保留一些固定的地址空間來(lái)存儲(chǔ)一些易失性用戶數(shù)據(jù)?

    是否可以在比特流的開(kāi)頭保留一些固定的地址空間來(lái)存儲(chǔ)一些易失性用戶數(shù)據(jù)(例如,一些用戶參數(shù)等)?我
    發(fā)表于 08-11 07:12

    如何通過(guò)使用gm/Id的方法來(lái)簡(jiǎn)化設(shè)計(jì)運(yùn)放?

     直想通過(guò)使用gm/Id的方法來(lái)簡(jiǎn)化設(shè)計(jì)運(yùn)放;  但在實(shí)際設(shè)計(jì)過(guò)程中遇到較多的問(wèn)題;  然后參考了一些國(guó)外的文獻(xiàn),發(fā)現(xiàn)他們好多用此方法設(shè)計(jì)OTA;如果是常規(guī)的
    發(fā)表于 06-24 07:37

    JSON是什么?如何去創(chuàng)建JSON

    是鍵值對(duì)組成,使用大括號(hào)包圍,每個(gè)鍵由引號(hào)括起來(lái),鍵值使用冒號(hào)分割,多組鍵值對(duì)使用逗號(hào)分割。JSON訪問(wèn):json本身就是個(gè)對(duì)象json
    發(fā)表于 07-09 07:06

    更優(yōu)雅的方式去實(shí)現(xiàn)個(gè)Verilog版的狀態(tài)機(jī)

    的話相對(duì)來(lái)說(shuō)還算容易,而當(dāng)我們狀態(tài)機(jī)較大時(shí)狀態(tài)機(jī)的維護(hù)和閱讀就有點(diǎn)兒費(fèi)力了。那么我的狀態(tài)及能否這么來(lái)描述呢?是否種讀偽代碼的感覺(jué)呢?做真正的狀態(tài)描述很遺憾,上述寫(xiě)法并不是偽代碼,而
    發(fā)表于 07-13 14:56

    軟件是否安全的方法來(lái)檢測(cè)運(yùn)行軟件的是哪個(gè)MCU?

    MCU 使用個(gè)軟件。如果軟件可以檢測(cè)到 MCU 類型,基于此信息可以設(shè)置更高的 CPU 頻率,使用額外的定時(shí)器等。根據(jù)文檔,用戶軟件無(wú)法訪問(wèn) DBGMCU_IDCODE 和 DBGMCU_CR 寄存器(僅在調(diào)試模式下)。軟件是否
    發(fā)表于 12-05 09:24

    是否適當(dāng)/安全的方法來(lái)取消初始化FS26?

    您好,我想問(wèn)是否適當(dāng)/安全的方法來(lái)取消初始化 FS26。我的用例是:我在 Bootloader 軟件中讓 FS 進(jìn)入正常模式。但是如果我跳轉(zhuǎn)到應(yīng)用程序,我不能再次重新初始化它,因
    發(fā)表于 04-03 08:33

    軟件驅(qū)動(dòng)程序是否種相當(dāng)簡(jiǎn)單的方法來(lái)檢測(cè)安裝了哪個(gè)rtc設(shè)備?

    軟件驅(qū)動(dòng)程序是否種相當(dāng)簡(jiǎn)單的方法來(lái)檢測(cè)安裝了哪個(gè) rtc 設(shè)備?我們從 PCF2127 開(kāi)始,但由于其他原因正在重新設(shè)計(jì),并且由于 NRND 的 PCF2127 狀態(tài),考慮轉(zhuǎn)向 P
    發(fā)表于 04-06 07:31

    充電的控制方法哪些?

    充電的控制方法哪些? 為了防止電池過(guò)充,需要對(duì)充電終點(diǎn)進(jìn)行控制,當(dāng)電池充滿時(shí),會(huì)有一些特別的信息可利用來(lái)判斷充電是否達(dá)到終點(diǎn)。
    發(fā)表于 10-24 10:20 ?717次閱讀

    分享一些相對(duì)簡(jiǎn)單的方法來(lái)提升自己的數(shù)據(jù)安全性

    現(xiàn)如今,大數(shù)據(jù)云存儲(chǔ)普及程度越來(lái)越高,而無(wú)疑其信息的私密性也有被泄漏的風(fēng)險(xiǎn),由此引起的數(shù)據(jù)安全問(wèn)題是不容忽視的。不管所使用的系統(tǒng)采用何種構(gòu)造,用戶都可以通過(guò)一些相對(duì)簡(jiǎn)單的方法來(lái)提升自己的數(shù)據(jù)安全性。
    的頭像 發(fā)表于 02-06 10:35 ?6945次閱讀

    如何使用簡(jiǎn)單的方法來(lái)監(jiān)控打印機(jī)是否仍在運(yùn)行

    電子發(fā)燒友網(wǎng)站提供《如何使用簡(jiǎn)單的方法來(lái)監(jiān)控打印機(jī)是否仍在運(yùn)行.zip》資料免費(fèi)下載
    發(fā)表于 10-28 16:12 ?0次下載
    如何使用簡(jiǎn)單的<b class='flag-5'>方法來(lái)</b>監(jiān)控打印機(jī)<b class='flag-5'>是否</b>仍在運(yùn)行

    JSON的使用方法

    JSON個(gè)標(biāo)記符序列。這套標(biāo)記符包括: 構(gòu)造字符、字符串、數(shù)字和三個(gè)字面值 。 構(gòu)造字符 JSON包括六個(gè)構(gòu)造字符,分別是:左方括號(hào)、右方括號(hào)、左大括號(hào)、右大括號(hào)、冒號(hào)與逗號(hào)。 JSON
    的頭像 發(fā)表于 10-31 16:42 ?983次閱讀
    <b class='flag-5'>JSON</b>的使用<b class='flag-5'>方法</b>
    百家乐官网9人桌| 百家乐赌场方法| 百家乐官网连跳趋势| 望奎县| 澳门娱乐在线| 大发888-大发娱乐城| 老虎机单机游戏下载| 百家乐官网娱乐城优惠| 会宁县| 贺兰县| 时时博在线娱乐城| 盛世国际娱乐| 在线赌博网站| 台东县| 泸西县| 葫芦岛市| 百家乐官网蓝盾假网| 鄯善县| 资讯 | 大发888游戏平台下载| 全讯网hg055.com| 百家乐官网看大小路| 传奇百家乐官网的玩法技巧和规则 | 24葬书-葬法| 百家乐必胜下注法| 百家乐类游戏平台| 网上的百家乐是真是假| 威尼斯人娱乐场 澳门| 大发888怎么能不卡| 大发888公司赌场| 在线老虎机| 百家乐官网心态研究| 娱乐城百家乐官网可以代理吗| 申博百家乐官网公式软件| 温州百家乐官网的玩法技巧和规则| KK百家乐官网娱乐城 | 做生意房子选哪个方位| 澳门百家乐下路写法| 首席百家乐的玩法技巧和规则 | 做生意选店铺位置| 百家乐庄闲对冲|