QVariant与Json的各种纠葛——Qt

本文详细介绍了如何在Qt中使用QVariant进行Json数据的转换,包括从Json到QVariant的各种方式,以及反过来的转换过程。文章还强调了转换过程中类型匹配的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言 

我之前虽了解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里存入的是什么,取出来的,类型一定要对应上!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十年之少

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值