精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

QT原生的QJson是否有更優雅的方法來封裝一些Json對象

嵌入式應用研究院 ? 來源:嵌入式應用研究院 ? 作者:楊源鑫 ? 2023-10-08 09:26 ? 次閱讀

之前一直用的是cJSON庫來封裝和解析,寫久了感覺實在太丑,又難維護,于是還是研究下QT原生的QJson是否有更優雅的方法來封裝一些Json對象,果不其然,通過閱讀QT開發文檔發現,QT封裝的Json非常強大,其中Json對象可以有很多種形式,我們看到qjsonobject.h中:

templateclassQMap;
typedefQMapQVariantMap;
templateclassQHash;
typedefQHashQVariantHash;
,>,>

基于模板創建了QMap和QHash兩種容器類型,我們先來介紹QMap和QVariantMap的應用,在介紹QVariantMap的應用之前,先來了解QMap以及QVariant。

1、QMap

QMap是Qt庫中的一個關聯容器,它存儲鍵值對,其中每個鍵都是唯一的。這使得你可以通過鍵值來快速查找或訪問存儲在QMap中的值。

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

插入:使用insert()函數將一個鍵值對插入到QMap中。

獲取值:使用value()函數通過鍵來獲取值。

查找:使用find()函數查找具有給定鍵的鍵值對。

刪除:使用remove()函數刪除具有給定鍵的鍵值對。

遍歷:使用iterator(如QMapIterator或constIterator)遍歷QMap中的所有鍵值對。

下面是一個簡單的QMap使用例子:

#include
#include
#include

intmain(intargc,char*argv[])
{
QMapmap;
map.insert("One",1);
map.insert("Two",2);
map.insert("Three",3);

//使用value()函數獲取值
intone=map.value("One");
qDebug()<,>

運行結果:

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

注意,QMap不保證同義詞的插入順序,即如果插入相同的鍵,第二個插入的鍵值對將出現在QMap的末尾。如果需要保持插入順序,可以使用QMap,其中QList存儲與該鍵關聯的值。,qlist>

2、QVariant

QVariant是一個可以存儲多種數據類型的類,它可以方便地在不同的函數、類、模塊之間傳遞數據。QVariant的用法非常簡單,只需要使用構造函數、賦值操作符、setValue函數等方法將數據存儲到QVariant對象中,然后使用toXXX函數將QVariant對象轉換為指定類型的數據。例如:

#include
#include
#include
#include

intmain(intargc,char*argv[])
{
QCoreApplicationa(argc,argv);

//存儲數據
QVariantv1=10;//存儲整數
QVariantv2="hello";//存儲字符串
QVariantv3=QDateTime::currentDateTime();//存儲日期時間

//獲取數據
inti=v1.toInt();//將QVariant轉換為整數
QStrings=v2.toString();//將QVariant轉換為字符串
QDateTimedt=v3.toDateTime();//將QVariant轉換為日期時間

//輸出數據
qDebug()<

運行結果:

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

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的請求對象:

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

編寫一個程序封裝一個基于JsonRpc2.0的請求對象:

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

應用主程序調用:

#include
#include
#include
#include
#include

/*
*Rpc結構
{
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封裝參數對象部分的數據結構
constQVariantMap&ParamsObject={
{"color","blue"},
{"status","on"}
};
QByteArrayJsonStr=JsonRpc2ProcotolPacket(15,"Set/LedStatus",ParamsObject);
qDebug()<

運行結果:

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

用起來簡直不要太爽!






審核編輯:劉清

,>,>,>,>
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲器
    +關注

    關注

    38

    文章

    7452

    瀏覽量

    163602
  • javascript
    +關注

    關注

    0

    文章

    516

    瀏覽量

    53792
  • C++語言
    +關注

    關注

    0

    文章

    147

    瀏覽量

    6970

原文標題:一種基于QT應用程序封裝JsonRpc2.0協議請求對象的便捷方法

文章出處:【微信號:嵌入式應用研究院,微信公眾號:嵌入式應用研究院】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    是否一種方法來確定GPIF接口在等待GPIF主機的數據時干還是空

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

    什么好的方法來實現對某個信號的延時嗎?

    在設計中, 往往需要對某個信號做定(任意長)的延時, 有沒有好的方法來實現?而不是采用類似移位寄存器的方法來延時.
    發表于 09-19 04:23

    是否任何方法來打開/關閉由復雜I/O產生的PWM信號?

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

    是否可以在比特流的開頭保留一些固定的地址空間存儲一些易失性用戶數據?

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

    如何通過使用gm/Id的方法來簡化設計運放?

     直想通過使用gm/Id的方法來簡化設計運放;  但在實際設計過程中遇到較多的問題;  然后參考了一些國外的文獻,發現他們好多用此方法設計OTA;如果是常規的
    發表于 06-24 07:37

    JSON是什么?如何去創建JSON

    是鍵值對組成,使用大括號包圍,每個鍵由引號括起來,鍵值使用冒號分割,多組鍵值對使用逗號分割。JSON訪問:json本身就是對象json
    發表于 07-09 07:06

    更優雅的方式去實現個Verilog版的狀態機

    的話相對來說還算容易,而當我們狀態機較大時狀態機的維護和閱讀就有點兒費力了。那么我的狀態及能否這么描述呢?是否種讀偽代碼的感覺呢?做真正的狀態描述很遺憾,上述寫法并不是偽代碼,而
    發表于 07-13 14:56

    軟件是否安全的方法來檢測運行軟件的是哪個MCU?

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

    是否適當/安全的方法來取消初始化FS26?

    您好,我想問是否適當/安全的方法來取消初始化 FS26。我的用例是:我在 Bootloader 軟件中讓 FS 進入正常模式。但是如果我跳轉到應用程序,我不能再次重新初始化它,因
    發表于 04-03 08:33

    軟件驅動程序是否種相當簡單的方法來檢測安裝了哪個rtc設備?

    軟件驅動程序是否種相當簡單的方法來檢測安裝了哪個 rtc 設備?我們從 PCF2127 開始,但由于其他原因正在重新設計,并且由于 NRND 的 PCF2127 狀態,考慮轉向 P
    發表于 04-06 07:31

    充電的控制方法哪些?

    充電的控制方法哪些? 為了防止電池過充,需要對充電終點進行控制,當電池充滿時,會有一些特別的信息可利用來判斷充電是否達到終點。
    發表于 10-24 10:20 ?698次閱讀

    分享一些相對簡單的方法來提升自己的數據安全性

    現如今,大數據云存儲普及程度越來越高,而無疑其信息的私密性也有被泄漏的風險,由此引起的數據安全問題是不容忽視的。不管所使用的系統采用何種構造,用戶都可以通過一些相對簡單的方法來提升自己的數據安全性。
    的頭像 發表于 02-06 10:35 ?6873次閱讀

    Keil環境下Jansson解析庫的使用——基于STM32F103

    作者:王超首發:電子電路開發學習前言之前我曾經寫過幾個JSON解析庫的使用方法Qt平臺下使用QJson解析和構建JSON字符串使用cJSO
    發表于 01-26 19:28 ?7次下載
    Keil環境下Jansson解析庫的使用——基于STM32F103

    如何使用簡單的方法來監控打印機是否仍在運行

    電子發燒友網站提供《如何使用簡單的方法來監控打印機是否仍在運行.zip》資料免費下載
    發表于 10-28 16:12 ?0次下載
    如何使用簡單的<b class='flag-5'>方法來</b>監控打印機<b class='flag-5'>是否</b>仍在運行

    JSON的使用方法

    JSON個標記符序列。這套標記符包括: 構造字符、字符串、數字和三個字面值 。 構造字符 JSON包括六個構造字符,分別是:左方括號、右方括號、左大括號、右大括號、冒號與逗號。 JSON
    的頭像 發表于 10-31 16:42 ?852次閱讀
    <b class='flag-5'>JSON</b>的使用<b class='flag-5'>方法</b>