首页 > 其他分享 >Qt QVariant与Json的各种纠葛

Qt QVariant与Json的各种纠葛

时间:2022-11-21 15:56:24浏览次数:45  
标签:QByteArray Qt 存入 Json QVariantMap obj QVariant

前言
  我之前虽了解QVariant的一些性能,但是没有与Json各种的互转。以前我解析Json后,是将其转化为我自定义的结构体,既方便看,又方便调用,就是解析转换的时候麻烦些;后续看到同事直接将Json转换为QVariant(或QVariantMap QVariantList),然后直接调用,觉得也不错,但是中间有一些迷糊的地方,所以在此处记录下来。

各种互转
  先提醒一句,这也是我常犯的错误:千万别想着一步到位,QVariant存入的是什么类型,就将其转出什么类型!!!

Json转为QVariant
QJsonObject转为QVariant,QVariant的构造函数是包含这些类型的。

 1     QJsonObject obj;
 2     obj.insert("name1","val1");
 3     obj.insert("name2","val2");
 4     obj.insert("name3","val3");
 5     QJsonArray arr;
 6     for(int i=0;i<5;i++)
 7         arr.append(i);
 8  
 9     obj.insert("name4",arr);
10  
11     QVariant var(obj);

当然 ,QJsonArray转为QVariant也是一样的

QVariant var2(arr);

还有,QJsonDocument转为QVariant

QVariant var3(QJsonDocument(obj));

 一般为了方便本地调用,是直接将其转化为QVariantMap、QVariantHash或QVariantList

1     QVariantList varList=arr.toVariantList();
2     QVariantMap varMap=obj.toVariantMap();
3     QVariantHash varHash=obj.toVariantHash();

使用的时候,直接调用

1     qDebug()<<"varName_1="<<varMap.value("name1").toString();
2     qDebug()<<"varName_2="<<varHash.value("name2").toString();
3     for(int i=0;i<varList.count();i++){
4         qDebug()<<varList.at(i).toInt();
5     }

QVariant转为Json

这个只需要直接转换就可以了,前提是QVariant原本存入是类型就是Json

const QJsonObject& _obj=var.toJsonObject();

 若存入QVariant的类型是QVariantMap,那么就要多一个步骤了

1     QVariant var4(obj.toVariantMap());
2  
3     const QJsonObject& __obj=QJsonObject::fromVariantMap(var4.toMap());
4     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,那么什么好说的,当然直接转换,当然,出来的结果不是空的,除非你存入的是空的字节数组 

1     QJsonDocument doc(obj);
2     QVariant var5(doc.toJson(QJsonDocument::Compact));
3     qDebug()<<var5.toByteArray();

结束语 

QVariant里存入的是什么,取出来的,类型一定要对应上!!!!

标签:QByteArray,Qt,存入,Json,QVariantMap,obj,QVariant
From: https://www.cnblogs.com/ybqjymy/p/16911621.html

相关文章

  • JS JSON表格数据导出Excel
    我根据网上文章进行改造,没有直接照搬人家东西,不需要引入任何插件纯原生JS实现效果图:    调用代码://列letcolumn=[{text:'姓名',key:'name'},{......
  • 使用nginx反向代理解决跨域问题,处理携带JSON请求体的POST请求前置预检请求跨域问题
    直接上nginx配置:location/api/{proxy_set_headerAccess-Control-Allow-Origin*;proxy_set_headerAccess-Control-Allow-Methods'GET,POST,OPTIONS';proxy_......
  • QT + OpenGL
    1、QT+Opengl的优势1)安装简单,QT借助于Qt的封装,无需配置第三方库如:GLFW+GLADGLFWGLADGLFW解决操作系统层面的不同GLAD使得代码可以用于不同的Opengl驱动......
  • Qt中定时器的所有使用方式
    在Qt中使用定时器一般有三种方式:参考博客:​​Qt|定时器的使用-知乎​​​​QT定时器事件startTimer_谢永奇1的博客-_starttimer​​​​Qt之定时器_付康为的博客-qt定......
  • 48、OAK通过共享内存传递变长结构体(Rapidjson)进行数据和图片交互
    基本思想:主要学习一下在共享内存中传递变长的数据,这样在c#调用c++dll也可以雷同操作,以oak的检测和共享内存为代码整合,集成了rapidjson的使用,代码自己摘要和参考吧cmakelist......
  • 为什么工业软件开发一般用的都是QT?
    这个说法不大准确吧,CAD、MATLAB、EDA、PRO-E、Proteus、POWERPCB是用的QT么?SAP、EBS(ORACLE)、LabView是用的QT么?西门子的工业控制类的软件(比如SIMATICSCADA)用的QT么?这些都......
  • MQTT生产实践总结与EMQX5.0探索
     引言之前做了一个系统,系统的一部分硬件设备是使用MQTT协议接入的,无奈只好去研究它。好不容拼凑出一套能用的代码,上生产以后频频出现故障,后来稀里糊涂的解决了,但是一直......
  • Linux切换账户(或ssh远程)执行QT程序无法输入中文
    系统:银河麒麟前提条件:已经安装了fcitx插件,因为QTcreator本身不支持中文输入,需要插件支持;场景1:一台计算机;使用普通用户(例如:user01)登录并打包一个可以执......
  • pyqt5图形化界面程序打包成exe可执行文件
    1.pipinstallpyinstaller2.打开命令行目录转到项目的所在目录下  3.打包主程序文件  pyinstaller-F-wmain.py。当前目录下会生成build,dist文件夹和main.spe......
  • vs+qt静态编译环境配置
    一、简述Qt官方提供二进制安装包+vs开发环境默认只能通过动态编译。可以通过Qt提供工具Windeployqt把相关qt依赖dll复制到当前目录(但是会有windows系统提供dll不能关联,所以......