之前一直用的是cjson库来封装和解析,写久了感觉实在太丑,又难维护,于是还是研究下qt原生的qjson是否有更优雅的方法来封装一些json对象,果不其然,通过阅读qt开发文档发现,qt封装的json非常强大,其中json对象可以有很多种形式,我们看到qjsonobject.h中:
template class qmap;typedef qmap qvariantmap;template class qhash;typedef qhash qvarianthash;,>,>
基于模板创建了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 int main(int argc, char *argv[]){ qmap map; map.insert(one, 1); map.insert(two, 2); map.insert(three, 3); // 使用value()函数获取值 int one = 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:
运行结果:
注意,qmap不保证同义词的插入顺序,即如果插入相同的键,第二个插入的键值对将出现在qmap的末尾。如果需要保持插入顺序,可以使用qmap,其中qlist存储与该键关联的值。,qlist>
2、qvariant
qvariant是一个可以存储多种数据类型的类,它可以方便地在不同的函数、类、模块之间传递数据。qvariant的用法非常简单,只需要使用构造函数、赋值操作符、setvalue函数等方法将数据存储到qvariant对象中,然后使用toxxx函数将qvariant对象转换为指定类型的数据。例如:
#include #include #include #include int main(int argc, char *argv[]){ qcoreapplication a(argc, argv); // 存储数据 qvariant v1 = 10; // 存储整数 qvariant v2 = hello; // 存储字符串 qvariant v3 = qdatetime::currentdatetime(); // 存储日期时间 // 获取数据 int i = v1.toint(); // 将 qvariant 转换为整数 qstring s = v2.tostring(); // 将 qvariant 转换为字符串 qdatetime dt = v3.todatetime(); // 将 qvariant 转换为日期时间 // 输出数据 qdebug() << v1 = << i; qdebug() << v2 = << s; qdebug() << v3 = << dt; return a.exec();}
运行结果:
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的请求对象:
qbytearray jsonrpc2procotolpacket(int id, qstring method, const qvariantmap &_params){ qjsonobject rootobject; qjsonobject params = qvariant(_params).tojsonobject(); rootobject.insert(jsonrpc, 2.0); rootobject.insert(id, id); rootobject.insert(method, method); rootobject.insert(params, params); qjsondocument jsondoc(rootobject); return jsondoc.tojson();}
应用主程序调用:
#include #include #include #include #include /* * rpc结构 { jsonrpc: 2.0, id: 1, method: set/ledstatus, params: { color: blue, status: on } }*/qbytearray jsonrpc2procotolpacket(int id, qstring method, const qvariantmap &_params){ qjsonobject rootobject; qjsonobject params = qvariant(_params).tojsonobject(); rootobject.insert(jsonrpc, 2.0); rootobject.insert(id, id); rootobject.insert(method, method); rootobject.insert(params, params); qjsondocument jsondoc(rootobject); return jsondoc.tojson();}int main(int argc, char *argv[]){ qcoreapplication a(argc, argv); //使用qvariantmap封装参数对象部分的数据结构 const qvariantmap ¶msobject = { {color, blue}, {status, on} }; qbytearray jsonstr = jsonrpc2procotolpacket(15, set/ledstatus, paramsobject); qdebug() <,>,>,>
MIUI12.5浏览器新升级隐私保护能力
电梯里的智能镜子显示屏将重新定义电梯广告
水蒸气透过率测试仪的产品特点是怎样的
华擎AM4 B450系列主板BIOS更新:支持Ryzen5000处理器
TI DSP为啥连接不上?JTAG接口无法连接的问题
QT原生的QJson是否有更优雅的方法来封装一些Json对象
荣耀10青春版已经成为时下跨国界联合营销的热门产品
AT&T计划在美国农村地区使用3.5 GHz频段推出高速无线家庭互联网
从“芯”出发!且看如何从硬件设计的角度破解智能穿戴的需求痛点?
μPC2002 9W音频功率放大电路
一文读懂工业旋转变压器传感应用的电气设计要素
2020年中国手机产量突破13亿台,5G手机累计出货量超1.4亿台
研制无线电发射设备的管理规定
什么是传输网的服务类别
ChatGPT的注册和使用步骤
如何测评小间距LED显示屏
TCL第二个海外呼叫中心在欧洲开通
什么是I2C协议?
“墨子号”飞天 量子通信能改变VR传输瓶颈?
领导力UP!中兴通讯荣膺GlobalData "5G RAN领导者"