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()<< "one:" << one;

    // 使用constIterator遍历QMap
    QMap::const_iterator i;
    for (i = map.constBegin(); i != map.constEnd(); ++i) {
        qDebug() << "Key: " << i.key() << ", Value: " << i.value();
    }

    return 0;
}
,>,>

运行结果:

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()<< "v1 = " << i;
    qDebug() << "v2 = " << s;
    qDebug() << "v3 = " << dt;

    return a.exec();
}

运行结果:

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()<< JsonStr;
    return a.exec();
}

运行结果:

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

用起来简直不要太爽!






审核编辑:刘清

,>,>,>,>
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储器
    +关注

    关注

    38

    文章

    7492

    浏览量

    163828
  • javascript
    +关注

    关注

    0

    文章

    516

    浏览量

    53864
  • C++语言
    +关注

    关注

    0

    文章

    147

    浏览量

    6992

原文标题:一种基于QT应用程序封装JsonRpc2.0协议请求对象的便捷方法

文章出处:【微信号:嵌入式应用研究院,微信公众号:嵌入式应用研究院】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    关于Qt一些问题,希望大家多多指教!

    下方便?比如,在个button上右击,linux下没有反应,无法改变对象的名字,按住alt+shift+r,窗口也不会预览。同时一些汉字也不能输入等等。是我不会用,没有添加什么库,还是真的是在windows下方便,求指教,新人
    发表于 03-21 22:01

    是否一种方法来确定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 706次阅读

    分享一些相对简单的方法来提升自己的数据安全性

    现如今,大数据云存储普及程度越来越高,而无疑其信息的私密性也有被泄漏的风险,由此引起的数据安全问题是不容忽视的。不管所使用的系统采用何种构造,用户都可以通过一些相对简单的方法来提升自己的数据安全性。
    的头像 发表于 02-06 10:35 6908次阅读

    如何使用简单的方法来监控打印机是否仍在运行

    电子发烧友网站提供《如何使用简单的方法来监控打印机是否仍在运行.zip》资料免费下载
    发表于 10-28 16:12 0次下载
    如何使用简单的<b class='flag-5'>方法来</b>监控打印机<b class='flag-5'>是否</b>仍在运行

    JSON的使用方法

    JSON个标记符序列。这套标记符包括: 构造字符、字符串、数字和三个字面值 。 构造字符 JSON包括六个构造字符,分别是:左方括号、右方括号、左大括号、右大括号、冒号与逗号。 JSON
    的头像 发表于 10-31 16:42 909次阅读
    <b class='flag-5'>JSON</b>的使用<b class='flag-5'>方法</b>