之前一直用的是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()<"one:"?<,>
運行結果:
注意,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()<"v1?=?"?<
運行結果:

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()<
運行結果:

用起來簡直不要太爽!
審核編輯:劉清
,>,>,>,> -
存儲器
+關注
關注
39文章
7739瀏覽量
171674 -
javascript
+關注
關注
0文章
526瀏覽量
56331 -
C++語言
+關注
關注
0文章
147瀏覽量
7684
原文標題:一種基于QT應用程序封裝JsonRpc2.0協議請求對象的便捷方法
文章出處:【微信號:嵌入式應用研究院,微信公眾號:嵌入式應用研究院】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
關于Qt的一些問題,希望大家多多指教!
是否有一種方法來確定GPIF接口在等待GPIF主機的數據時干還是空
是否有任何方法來打開/關閉由復雜I/O產生的PWM信號?
是否可以在比特流的開頭保留一些固定的地址空間來存儲一些易失性用戶數據?
如何通過使用gm/Id的方法來簡化設計運放?
JSON是什么?如何去創建一種JSON?
以一種更優雅的方式去實現一個Verilog版的狀態機
軟件是否有安全的方法來檢測運行軟件的是哪個MCU?
是否有適當/安全的方法來取消初始化FS26?
軟件驅動程序是否有一種相當簡單的方法來檢測安裝了哪個rtc設備?
充電的控制方法有哪些?
分享一些相對簡單的方法來提升自己的數據安全性
JSON的使用方法
QT原生的QJson是否有更優雅的方法來封裝一些Json對象
評論