Qt6.5示例:QJsonDocument类解析JSON文档

发布时间:2024年01月21日

01 QJsonDocument介绍

QJsonDocument是一个用于处理JSON(JavaScript Object Notation)文档的类。它提供了读写JSON文档的方法,可以将JSON文档以UTF-8编码的文本形式,和QT自身的二进制格式进行读写。

02 如何使用QJsonDocument

头文件:#include <QJsonDocument>

cmake:find_package(Qt6 REQUIRED COMPONENTS Core)

target_link_libraries(mytarget PRIVATE Qt6::Core)

qmake:QT += core

03 JSON文档介绍

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。

JSON的优点在于其简洁和清晰的层次结构,使得它成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

JSON对象是一个无序的“名称/值”对集合,以左括号“{”开始,右括号“}”结束。每个“名称”后跟一个冒号“:”,“名称/值”对之间使用逗号“,”分隔。

JSON数组是一个有序的“值”集合,以左括号“[”开始,右括号“]”结束。值之间使用逗号“,”分隔。

  • JSON文档示例:

以下JSON文档例子,包含有id,value,title,colors,window五个属性,每个属性有对应的值。其中id是整数,value是浮点数,title是字符串,colors是数组,window是一个嵌套JSON对象,包括width、height二个整数属性。

{
    "id": 100,
    "value": 99.5,
    "title": "20YC编程",
    "colors": ["red", "green", "blue"],
    "window":
    {
        "width": 1024,
        "height": 720
    }
}

04 QJsonDocument解析JSON文档方法

  • 加载JSON文档示例:

/**** 例子: ****/
#include <QJsonDocument>

QString json_string = "{\"id\":100,\"value\":99.5,\"title\":\"20YC编程\",\"colors\":[\"red\",\"green\",\"blue\"],\"window\":{\"width\":1024,\"height\":720}}";
// 通过QString加载JSON文档。
QJsonDocument json_doc = QJsonDocument::fromJson(json_string.toUtf8());
  • 加载JSON文件示例:

将上面JSON文档保存到"my.json"文件。

/**** 例子: ****/
#include <QJsonDocument>
#include <QFile>
#include <QDebug>

// 打开JSON文件。
QFile file("my.json");
if (!file.open(QIODevice::ReadOnly))
{
    return -1;
}
QByteArray byte_array = file.readAll();
file.close();

// 通过QByteArray加载JSON文档。
QJsonDocument json_doc = QJsonDocument::fromJson(byte_array);
  • 访问JSON属性值示例:

支持多级属性访问,例如:int i_window_width = json_doc["window"]["width"].toInt();

/**** 例子: ****/

// 访问"id"属性。
int i_id = json_doc["id"].toInt();                           // 返回 100
// 访问"value"属性。
double d_value = json_doc["value"].toDouble();               // 返回 99.5
// 访问"title"属性。
QString qstr_title = json_doc["title"].toString();           // 返回 "20YC编程"
// 访问 "window/width" 多级属性。
int i_window_width = json_doc["window"]["width"].toInt();    // 返回 1024

qDebug() << "id = " << i_id
        << ", value = " << d_value
        << ", title = " << qstr_title
        << ", window.width = " << i_window_width;
  • 访问JSON属性列表示例:

/**** 例子: ****/
#include <QJsonArray>

// 访问属性列表。
QJsonArray json_array = json_doc["colors"].toArray();
int i_colors_size = json_array.size();    // 返回 3。
// 遍历列表。
for (int i = 0; i < i_colors_size; ++i)
{
    QString qstr_color = json_array[i].toString();
    // 分别打印:"red","green","blue"
    qDebug() << "color = " << qstr_color;
}
  • 通过QJsonValue访问属性示例:

/**** 例子: ****/

// 通过QJsonValue访问属性。
QJsonValue json_value = json_doc["window"];
int i_width = json_value["width"].toInt();      // 返回 1024
int i_height = json_value["height"].toInt();    // 返回 720
qDebug() << "window.width = " << i_width << ", window.height = " << i_height;

05 QJsonDocument解析JSON文件完整示例

  • 示例代码:

#include <QCoreApplication>
#include <QJsonDocument>
#include <QFile>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 打开JSON文件。
    QFile file("my.json");
    if (!file.open(QIODevice::ReadOnly))
    {
        return -1;
    }
    QByteArray byte_array = file.readAll();
    file.close();

    // 通过QByteArray加载JSON文档。
    QJsonDocument json_doc = QJsonDocument::fromJson(byte_array);

//    // 通过QString加载JSON文档。
//    QString json_string = "{\"id\":100,\"value\":99.5,\"title\":\"20YC编程\",\"colors\":[\"red\",\"green\",\"blue\"],\"window\":{\"width\":1024,\"height\":720}}";
//    QJsonDocument json_doc = QJsonDocument::fromJson(json_string.toUtf8());

    // 访问"id"属性。
    int i_id = json_doc["id"].toInt();                           // 返回 100
    // 访问"value"属性。
    double d_value = json_doc["value"].toDouble();               // 返回 99.5
    // 访问"title"属性。
    QString qstr_title = json_doc["title"].toString();           // 返回 "20YC编程"
    // 访问 "window/width" 多级属性。
    int i_window_width = json_doc["window"]["width"].toInt();    // 返回 1024

    qDebug() << "id = " << i_id
             << ", value = " << d_value
             << ", title = " << qstr_title
             << ", window.width = " << i_window_width;

    // 通过QJsonValue访问属性。
    QJsonValue json_value = json_doc["window"];
    int i_width = json_value["width"].toInt();      // 返回 1024
    int i_height = json_value["height"].toInt();    // 返回 720
    qDebug() << "window.width = " << i_width << ", window.height = " << i_height;

    return a.exec();
}

06?附录:完整源码

关注公众号下载本示例完整源码(13_QJsonDocument_ReadXml.zip)。

-【End】-

#想了解更多精彩内容,关注下方公众号,还有示例源码、开发工具免费下载。

喜欢本文章,记得点赞、分享、关注哦~

文章来源:https://blog.csdn.net/yanghz/article/details/135372018
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。