当前位置:网站首页>QVariant与Json的各种纠葛——Qt
QVariant与Json的各种纠葛——Qt
2022-07-02 12:28:00 【十年之少】
前言
我之前虽了解QVariant的一些性能,但是没有与Json各种的互转。以前我解析Json后,是将其转化为我自定义的结构体,既方便看,又方便调用,就是解析转换的时候麻烦些;后续看到同事直接将Json转换为QVariant(或QVariantMap QVariantList),然后直接调用,觉得也不错,但是中间有一些迷糊的地方,所以在此处记录下来。
各种互转
先提醒一句,这也是我常犯的错误:千万别想着一步到位,QVariant存入的是什么类型,就将其转出什么类型!!!
Json转为QVariant
QJsonObject转为QVariant,QVariant的构造函数是包含这些类型的。
QJsonObject obj;
obj.insert("name1","val1");
obj.insert("name2","val2");
obj.insert("name3","val3");
QJsonArray arr;
for(int i=0;i<5;i++)
arr.append(i);
obj.insert("name4",arr);
QVariant var(obj);
当然 ,QJsonArray转为QVariant也是一样的
QVariant var2(arr);
还有,QJsonDocument转为QVariant
QVariant var3(QJsonDocument(obj));
一般为了方便本地调用,是直接将其转化为QVariantMap、QVariantHash或QVariantList
QVariantList varList=arr.toVariantList();
QVariantMap varMap=obj.toVariantMap();
QVariantHash varHash=obj.toVariantHash();
使用的时候,直接调用
qDebug()<<"varName_1="<<varMap.value("name1").toString();
qDebug()<<"varName_2="<<varHash.value("name2").toString();
for(int i=0;i<varList.count();i++){
qDebug()<<varList.at(i).toInt();
}
QVariant转为Json
这个只需要直接转换就可以了,前提是QVariant原本存入是类型就是Json
const QJsonObject& _obj=var.toJsonObject();
若存入QVariant的类型是QVariantMap,那么就要多一个步骤了
QVariant var4(obj.toVariantMap());
const QJsonObject& __obj=QJsonObject::fromVariantMap(var4.toMap());
qDebug()<<__obj.value("name1").toString();
QVariant转为QByteArray
看帮助文档,可以看出QVariant有方法可以直接转化成QByteArray,就直接将其转换为QByteArray,那么你拿到的QByteArray很可能就是空的~
我还是强调存入QVariant的是什么,你就要直接将其转换为什么,至于其他的类型,再继续转换。
若存入QVariant的是QJsonObject之类
qDebug()<<QJsonDocument(var.toJsonObject()).toJson(QJsonDocument::Compact);
若存入的是QVariant的是QVariantMap之类
qDebug()<<QJsonDocument::fromVariant(var4).toJson();
若存入的是QByteArray,那么什么好说的,当然直接转换,当然,出来的结果不是空的,除非你存入的是空的字节数组
QJsonDocument doc(obj);
QVariant var5(doc.toJson(QJsonDocument::Compact));
qDebug()<<var5.toByteArray();
结束语
QVariant里存入的是什么,取出来的,类型一定要对应上!!!!
边栏推荐
- [leetcode] 876 intermediate node of linked list
- [leetcode] 344 reverse string
- [leetcode] 1020 number of enclaves
- 2303. 计算应缴税款总额
- 如何實現十億級離線 CSV 導入 Nebula Graph
- [development environment] install Visual Studio Ultimate 2013 development environment (download software | install software | run software)
- [experience cloud] how to get the metadata of experience cloud in vscode
- 解决BASE64Encoder报错的问题
- /Bin/ld: cannot find -lpam
- 数组和链表的区别浅析
猜你喜欢
如何實現十億級離線 CSV 導入 Nebula Graph
Experiment collection of University "Fundamentals of circuit analysis". Experiment 4 - Research on linear circuit characteristics
XPT2046 四线电阻式触摸屏
Traversal before, during and after binary tree
《大学“电路分析基础”课程实验合集.实验五》丨线性有源二端网络等效电路的研究
Experiment collection of University "Fundamentals of circuit analysis". Experiment 7 - Research on sinusoidal steady-state circuit
【LeetCode】1905-统计子岛屿
[development environment] install the Chinese language pack for the 2013 version of visual studio community (install test agents 2013 | install visual studio 2013 simplified Chinese)
智联招聘的基于 Nebula Graph 的推荐实践分享
Xpt2046 four wire resistive touch screen
随机推荐
Pyinstaller打包exe附带图片的方法
6096. Success logarithm of spells and potions
【Experience Cloud】如何在VsCode中取得Experience Cloud的MetaData
使用FFmpeg命令行进行UDP、RTP推流(H264、TS),ffplay接收
Use ffmpeg command line to push UDP and RTP streams (H264 and TS), and ffplay receives
/bin/ld: 找不到 -lpam
[leetcode] 695 - maximum area of the island
Traversal before, during and after binary tree
Moveit 避障路径规划 demo
Postgressql stream replication active / standby switchover primary database no read / write downtime scenario
(Video + graphic) machine learning introduction series - Chapter 5 machine learning practice
2303. Calculate the total tax payable
【LeetCode】877-石子游戏
[leetcode] 1020 number of enclaves
/bin/ld: 找不到 -lcrypto
[leetcode] 344 reverse string
Some problems about pytorch extension
SQL modification statement
[development environment] install Visual Studio Ultimate 2013 development environment (download software | install software | run software)
Cultural scores of summer college entrance examination