当前位置: 首页 > 网络知识

Qt QVariant与Json的各种纠葛

时间:2026-01-25 16:16:51

前言
  我之前虽了解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<varListount();i++)

QVariant转为Json

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

const QJsonObject& _obj=var.toJsonObject();

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

1 QVariant var4(obj.toVariantMap()); 2 3 const QJsonObject& __obj=QJsonObject::frVariantMap(var4.toMap()); 4 qDebug()<<__obj.value("name1").toString();

QVariant转为QByteArray
看帮助文档,可以看出QVariant有方法可以直接转化成QByteArray,就直接将其转换为QByteArray,那么你拿到的QByteArray很可能就是空的~

我还是强调存入QVariant的是什么,你就要直接将其转换为什么,至于其他的类型,再继续转换。

若存入QVariant的是QJsonObject之类

qDebug()<<QJsonDocument(var.toJsonObject()).toJson(QJsonDocument::Cpact);

若存入的是QVariant的是QVariantMap之类

qDebug()<<QJsonDocument::frVariant(var4).toJson();

若存入的是QByteArray,那么什么好说的,当然直接转换,当然,出来的结果不是空的,除非你存入的是空的字节数组

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

结束语

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



上一篇:​一文解读循环肿瘤细胞检测
下一篇:解决 OpenAI‘s API is not available in your country
Qt
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器
  • 英特尔第五代 Xeon CPU 来了:详细信息和行业反应
  • 由于云计算放缓引发扩张担忧,甲骨文股价暴跌
  • Web开发状况报告详细介绍可组合架构的优点
  • 如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳
  • 美光在数据中心需求增长后给出了强有力的预测
  • 2027服务器市场价值将接近1960亿美元
  • 生成式人工智能的下一步是什么?
  • 分享在外部存储上安装Ubuntu的5种方法技巧
  • 全球数据中心发展的关键考虑因素
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器

    英特尔第五代 Xeon CPU 来了:详细信息和行业反应

    由于云计算放缓引发扩张担忧,甲骨文股价暴跌

    Web开发状况报告详细介绍可组合架构的优点

    如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳

    美光在数据中心需求增长后给出了强有力的预测

    2027服务器市场价值将接近1960亿美元

    生成式人工智能的下一步是什么?

    分享在外部存储上安装Ubuntu的5种方法技巧

    全球数据中心发展的关键考虑因素