• QVariant与Json的各种纠葛——Qt


    前言 

    我之前虽了解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. obj.insert("name4",arr);
    9. 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. const QJsonObject& __obj=QJsonObject::fromVariantMap(var4.toMap());
    3. 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里存入的是什么,取出来的,类型一定要对应上!!!!

  • 相关阅读:
    「C#」WPF学习笔记-基础类及继承关系
    webgl与webgpu比较
    Day 5 C++
    Redisson实现分布式锁原理、自动续期机制分析
    为域名加https的方法是什么?
    SQL语句之like操作符
    “数智芯生,云端共创”,利尔达精彩亮相第十八届国际物联网展
    优化销售策略,突破企业全面预算管理难题
    C++笔试题之n阶楼梯问题:每次只能走1阶或2阶,有多少种方法走完
    从零开始,开发一个 Web Office 套件(11):支持中文输入法(or 其它使用输入法的语言)
  • 原文地址:https://blog.csdn.net/xiaopei_yan/article/details/125553341