Qt解析json格式数据

json格式

对象格式

一个对象, 由一个大括号表示:
括号中 描述对象的属性:
通过键值对来描述对象的属性 (可以理解为, 大括号中, 包含的是一个个的键值对.)

{ 
	"name":"小明", 
	"info":"学生" 
}

数组格式

在JSON格式中可以与对象互相嵌套
[元素1,元素2…]

[
    {
        "dt": "20240417020000968"
    },
    {
        "ids": [
            {
                "dis": 608,
                "id": 131859
            }
        ],
        "lv": 1,
        "nm": "C1"
    },
    {
        "ids": [
            {
                "dis": 0,
                "id": 131859
            }
        ],
        "lv": 0,
        "nm": "C1-22"
    }
]

QJsonDocument, QJsonObject,QJsonArray,QJsonValue

QJsonDocument 类提供了一种读取和写入 JSON 文档的方法。
QJsonDocument 是一个包装完整 JSON 文档的类,可以从基于 UTF-8 编码的文本表示以及 Qt 自己的二进制格式读取和写入此文档。
可以使用 QJsonDocument::fromJson() 将 JSON 文档从其基于文本的表示形式转换为 QJsonDocument。toJson() 将其转换回文本。解析器非常快速和高效,并将JSON转换为Qt使用的二进制表示。
解析文档的有效性可以通过 !isNull() 查询
可以使用 isArray() 和 isObject() 查询文档是否包含数组或对象。可以使用 array() 或 object() 检索文档中包含的数组或对象,然后读取或操作。
也可以使用 fromBinaryData() 或 fromRawData() 从存储的二进制表示形式创建文档。

例一:如何构建QJsonObject和QJsonDocument

#include <QByteArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
#include <QDebug>
 
int main()
{
    // 创建一个JSON对象
    QJsonObject object;
    object.insert("name", "John");
    object.insert("age", 30);
 
    // 将JSON对象转换为QJsonDocument
    QJsonDocument document(object);
 
    // 将QJsonDocument转换为QByteArray
    QByteArray data = document.toJson();
 
    // 输出QByteArray
    qDebug() << data;
 
    // 将QByteArray转换为QJsonDocument
    QJsonDocument newDocument = QJsonDocument::fromJson(data);
 
    // 将QJsonDocument转换为JSON对象
    QJsonObject newObject = newDocument.object();
 
    // 获取JSON对象中的值
    QString name = newObject.value("name").toString();
    int age = newObject.value("age").toInt();
 
    // 输出值
    qDebug() << "Name: " << name;
    qDebug() << "Age: " << age;
 
    return 0;
}

例二:解析前面的嵌套型json数据

int Widget::parseJsonData(QString name,QString strData)
{
    QString str =  "[{\"dt\":\"20240417020000968\"},{\"ids\":[{\"dis\":608,\"id\":131859}],\"lv\":1,\"nm\":\"C1\"},{\"ids\":[{\"dis\":0,\"id\":131859}],\"lv\":0,\"nm\":\"C1-22\"}]";
        
    QJsonDocument doc = QJsonDocument::fromJson(str.toUtf8());
    // 检查文档是否正确解析
    if (doc.isNull())
    {
        // qDebug() << "Failed to parse JSON";
        QMessageBox::warning(this,"warn",QStringLiteral("Failed to parse JSON"));
        return 0;
    }
    // 从文档中提取数组
    QJsonArray array = doc.array();
    // 遍历数组中的每个元素
    for (const QJsonValue &value : array)
    {
        // 如果值是对象(对象是数组的成员)
        if (value.isObject())
        {
            QJsonObject obj = value.toObject();
            // 从对象中提取 "dt" 字段的值
            if (obj.contains("dt"))
            {
                //qDebug() << "dt:" << obj["dt"].toString();
            }
            // 从对象中提取 "ids" 字段的值。注意 "ids" 是一个嵌套的数组
            if (obj.contains("ids"))
            {
                QJsonArray idsArray = obj["ids"].toArray();
                for (const QJsonValue &subValue : idsArray)
                {
                    QJsonObject subObj = subValue.toObject();
                    int dis = subObj["dis"].toInt();
                    int id = subObj["id"].toInt();
                    // qDebug() << "dis:" << dis << ", id:" << id;
                }
            }
            // 从对象中提取 "lv" 和 "nm" 字段的值
            if (obj.contains("lv") && obj.contains("nm"))
            {
                // qDebug() << "lv:" << obj["lv"].toInt();
                //qDebug() << "nm:" << obj["nm"].toString();
                QString curname = obj["nm"].toString();
                int curValue = obj["lv"].toInt();
                if(curname == name )
                {
                    return curValue;
                }
            }
        }
    }
}

文章参考链接这里

相关推荐

  1. Qt解析json格式数据

    2024-04-21 18:56:05       36 阅读
  2. 数据转换成json格式

    2024-04-21 18:56:05       45 阅读
  3. 使用asp查询数据库,返回json格式数据

    2024-04-21 18:56:05       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-21 18:56:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-21 18:56:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-21 18:56:05       82 阅读
  4. Python语言-面向对象

    2024-04-21 18:56:05       91 阅读

热门阅读

  1. 贪心算法-跳跃游戏

    2024-04-21 18:56:05       36 阅读
  2. mysqlslap压力测试和线程池

    2024-04-21 18:56:05       32 阅读
  3. 类声明是public类型的变量如何赋值

    2024-04-21 18:56:05       30 阅读
  4. Ceph学习 -9.认证管理-用户实践

    2024-04-21 18:56:05       39 阅读
  5. web配置https

    2024-04-21 18:56:05       37 阅读
  6. 基于CppHttpLib的Httpserver

    2024-04-21 18:56:05       45 阅读
  7. Ubuntu上根据关键字模糊查找指定文件夹或文件

    2024-04-21 18:56:05       42 阅读
  8. ceph large omap objects

    2024-04-21 18:56:05       38 阅读
  9. Ceph学习 -10.认证管理-秘钥管理

    2024-04-21 18:56:05       107 阅读
  10. vue 前端参值后端接收的几种方式

    2024-04-21 18:56:05       39 阅读
  11. 【linux】centos7 开机 进单用户模式修改root密码

    2024-04-21 18:56:05       33 阅读
  12. r-tree 总结

    2024-04-21 18:56:05       40 阅读
  13. R语言数据分析案例

    2024-04-21 18:56:05       43 阅读