• QJsonObject的使用示例


    介绍:负责封装JSON对象,是键/值对列表,其中键是惟一字符串值由QJsonValue表示。

    1——QJsonObjec:封装了Json里的对象

    接口与QMap相似,都具有size()、insert()和remove()等操作,还可以使用标准C++迭代器模式对其内容进行迭代。

    使用示例:

    如下图所示:我们要写入这个数据的话,怎么写进去?

     

    1. QJsonObject gObj = JSONDATA.getSpecifyGroup(m_iSelectBtnIndex);
    2. //这里读取第一个QJsonObject对象,你可以按照你的需求自己去看
    3. //接下来我们就一层一层的读进去就可以了
    4. //新增加effect
    5. QJsonArray chValueArray;//这个随便写个要填加的数组,后面有用到
    6. for(int i = 0 ; i < ui->cbLightChanleNum->currentText().toInt() ; i++)
    7. {
    8. chValueArray.append(QJsonValue(0));
    9. }
    10. QJsonObject eObj = gObj[JSONKEY::EFFECT_JSONKEY].toObject() ;
    11. QJsonArray pArry = eObj[JSONKEY::PROGRAM_JSONKEY].toArray();
    12. for(int i=0; i<pArry.size();i++)
    13. {
    14. QJsonObject eObject = pArry.at(i).toObject();
    15. for(int i = 0; i < addrArray.size(); i++)
    16. {
    17. eObject.insert(QString::number(addrArray.at(i).toInt()),QJsonValue(chValueArray));
    18. }
    19. pArry.replace(i,eObject);
    20. }
    21. eObj[JSONKEY::PROGRAM_JSONKEY] = pArry;
    22. gObj[JSONKEY::EFFECT_JSONKEY] = eObj;
    23. JSONDATA.setSpecifyGroup(m_iSelectBtnIndex,gObj);//这里是封装的存入Json文件的接口

    记住一点就可以,[]前面的就是 Json数组格式,{}就是个Json对象格式

    2——QJsonArray: 封装了Json里的数组

    3——QJsonDocument:转换器
    上文知JSON一共有两种格式,即JSON数组和JSON对象,它们最终要利用JSON完成序列化,将数据转换为对应的字符串,或者有另外一种情况是字符串转换为JSON数组和JSON对象

    简单的JSON对象

    1. {
    2. "Cross Platform": true,
    3. "From": 1991,
    4. "Name": "Qt"
    5. }

     生成:

    1. // 构建 JSON 对象
    2. QJsonObject json;
    3. json.insert("Name", "Qt");
    4. json.insert("From", 1991);
    5. json.insert("Cross Platform", true);
    6. // 构建 JSON 文档
    7. QJsonDocument document;
    8. document.setObject(json);
    9. QByteArray byteArray = document.toJson(QJsonDocument::Compact);
    10. QString strJson(byteArray);
    11. qDebug() << strJson;

    简单的JSON解析

    1. QJsonParseError jsonError;
    2. // 转化为 JSON 文档
    3. QJsonDocument doucment = QJsonDocument::fromJson(byteArray, &jsonError);
    4. // 解析未发生错误
    5. if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError))
    6. {
    7. if (doucment.isObject())
    8. {
    9. // JSON 文档为对象
    10. QJsonObject object = doucment.object(); // 转化为对象
    11. if (object.contains("Name"))
    12. { // 包含指定的 key
    13. QJsonValue value = object.value("Name"); // 获取指定 key 对应的 value
    14. if (value.isString())
    15. { // 判断 value 是否为字符串
    16. QString strName = value.toString(); // 将 value 转化为字符串
    17. qDebug() << "Name : " << strName;
    18. }
    19. }
    20. if (object.contains("From"))
    21. {
    22. QJsonValue value = object.value("From");
    23. if (value.isDouble())
    24. {
    25. int nFrom = value.toVariant().toInt();
    26. qDebug() << "From : " << nFrom;
    27. }
    28. }
    29. if (object.contains("Cross Platform"))
    30. {
    31. QJsonValue value = object.value("Cross Platform");
    32. if (value.isBool())
    33. {
    34. bool bCrossPlatform = value.toBool();
    35. qDebug() << "CrossPlatform : " << bCrossPlatform;
    36. }
    37. }
    38. }
    39. }

     

     4——QJsonValue: 是对前面调到的数据类型的包装,C++中针对不同的数据类型有不同的声明,QJsonValue类是利用构造函数将各种数据类型进行了统一化,包装成一种类型,操作更为简单。

    QJsonValue 可以封装的基础数据类型有六种

    布尔类型QJsonValue::Bool
    浮点类型(包括整形)QJsonValue::Double
    字符串类型QJsonValue::String
    Json 数组类型QJsonValue::Array
    Json 对象类型QJsonValue::Object
    空值类型QJsonValue::Null


    (1)各种类型可以通过 QJsonValue 的构造函数被封装为一个类对象;

    (2)如果我们得到一个 QJsonValue 对象,如何判断内部封装的到底是什么类型的数据呢?

    1. // 是否是Json数组
    2. bool isArray() const;
    3. // 是否是Json对象
    4. bool isObject() const;
    5. // 是否是布尔类型
    6. bool isBool() const;
    7. // 是否是浮点类型(整形也是通过该函数判断)
    8. bool isDouble() const;
    9. // 是否是空值类型
    10. bool isNull() const;
    11. // 是否是字符串类型
    12. bool isString() const;
    13. // 是否是未定义类型(无法识别的类型)
    14. bool isUndefined() const;

    (3)通过判断函数得到对象内部数据的实际类型之后,如果有需求就可以再次将其转换为对应的基础数据类型。

    1. // 转换为Json数组
    2. QJsonArray toArray(const QJsonArray &defaultValue) const;
    3. QJsonArray toArray() const;
    4. // 转换为布尔类型
    5. bool toBool(bool defaultValue = false) const;
    6. // 转换为浮点类型
    7. double toDouble(double defaultValue = 0) const;
    8. // 转换为整形
    9. int toInt(int defaultValue = 0) const;
    10. // 转换为Json对象
    11. QJsonObject toObject(const QJsonObject &defaultValue) const;
    12. QJsonObject toObject() const;
    13. // 转换为字符串类型
    14. QString toString() const;
    15. QString toString(const QString &defaultValue) const;
    • QJsonValueQVariant互转
    1. QJsonValue fromVariant(const QVariant &variant)
    2. QVariant QJsonValue::toVariant() const
    • QJsonValue可以与QJsonObjectQJsonArray互转
    1. QJsonValue::QJsonValue(const QJsonArray &a)
    2. QJsonObject QJsonValue::toObject() const
    3. QJsonValue::QJsonValue(const QJsonObject &o)
    4. QJsonArray QJsonValue::toArray() const

  • 相关阅读:
    决策树与随机森林
    【算法练习】27:冒泡排序学习笔记
    golang定时器使用踩的坑:定时器每天执行一次
    阿里15年技术老兵用140个案例整合出Java微服务架构实战
    5G网络用户面时延测量
    论文导读|八月下旬Operations Research文章精选:定价问题专题
    [论文笔记] Scaling Laws for Neural Language Models
    Ubuntu 20.04 安装 SmartGit
    当你想家的时候
    每日一题:【LeetCode】258. 各位相加
  • 原文地址:https://blog.csdn.net/ligare/article/details/125393450