QT JSON数据解析

需要的头文件

#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonParseError>

转成JSON

/**
 * @brief MainWindow::toJson 转成JSON
 */
void MainWindow::toJson()
{
/*

    [
        true,
        3.14,
        3,
        "abc",
        [
            "subArr",
            123,
            456
        ],
        {
            "age": 16,
            "details": [
                "hello",
                "world"
            ],
            "name": "lufy"
        },
        {
            "age": 16,
            "name": "zuoluo",
            "person": {
                "age": 16,
                "name": "nami"
            }
        }
    ]

*/
    //--------json数组添加数据方式1-----------
    //QJsonArray array = {1, 3.14, 3, true, "abc"};

    //--------json数组添加数据方式2-----------
    QJsonArray array;
    array.append(QJsonValue(true));        // 添加bool 数据
    array.append(QJsonValue(3.14));        // 添加double 数据
    array.append(QJsonValue(3));         // 添加int数据
    array.append(QJsonValue("abc"));       // 添加Qstring数据

    QJsonArray subArray = {"subArr", 123, 456};
    array.append(QJsonValue(subArray));      //添加到数组之前必须添加完subArray的元素,不然不会生成

    //---------json对象添加方式1-----------
    QJsonObject obj1
    {
        {"name", "lufy"},
        {"age", 16}
    };
    //----------json对象添加数组-----------
    QJsonArray arr1 = {"hello", "world"};
    obj1.insert("details",arr1);

    array.append(QJsonValue(obj1));//添加到数组之前必须添加完obj1的元素,不然不会生成

    //----------json对象添加方式2-----------
    QJsonObject obj2;
    obj2.insert("name", "zuoluo");
    obj2.insert("age", 16);

    //----------json对象添加对象-----------
    QJsonObject obj3
    {
        {"name", "nami"},
        {"age", 16}
    };
    obj2.insert("person", obj3);

    array.append(QJsonValue(obj2));//添加到数组之前必须添加完obj2的元素,不然不会生成

    //添加到文档对象
    m_doc.setArray(array);

    QString strJaon(m_doc.toJson(QJsonDocument::Indented).constData());// json转Qstring,indented表示转为可读格式(有换行、缩进)

    ui->json_txt->setText(strJaon);
}

解析JSON

/**
 * @brief MainWindow::fromJson 解析JSON
 */
void MainWindow::fromJson()
{
    QString path = QFileDialog::getOpenFileName(this, "打开JSON文件", "./", "Json文件 (*.json)");
    if(path.isEmpty())
        return;

    // 打开JSON文件
    QFile file(path);
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        qWarning() << "打开文件失败!";
        return;
    }

    // 读取json数据
    QByteArray arr = file.readAll();
    file.close();
    if(arr.isEmpty())
        return;

    QJsonParseError err;
    QJsonDocument doc = QJsonDocument::fromJson(arr, &err);
    if(doc.isEmpty())
    {
        qWarning() << err.errorString();//打印失败信息
    }

    if(doc.isArray())// 如果json数据为数组类型
    {
        jsonParse(QJsonValue(doc.array()));
    }
    else if(doc.isObject())  // 如果Json数据为对象类型
    {
        jsonParse(QJsonValue(doc.object()));
    }
}

MainWindow.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonParseError>
#include <QDebug>
#include <QFileDialog>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void toJson();//转成JSON
    void fromJson();//解析JSON
    void save();//保存

private:
    Ui::MainWindow *ui;

    QJsonDocument m_doc;//文档对象
    void jsonParse(const QJsonValue &value);//数据解析
};

#endif // MAINWINDOW_H

MainWindow.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(ui->to_json_btn, &QPushButton::clicked, this, &MainWindow::toJson);
    connect(ui->from_json_btn, &QPushButton::clicked, this, &MainWindow::fromJson);
    connect(ui->save_btn, &QPushButton::clicked, this, &MainWindow::save);
}

MainWindow::~MainWindow()
{
    delete ui;
}

/**
 * @brief MainWindow::toJson 转成JSON
 */
void MainWindow::toJson()
{
/*

    [
        true,
        3.14,
        3,
        "abc",
        [
            "subArr",
            123,
            456
        ],
        {
            "age": 16,
            "details": [
                "hello",
                "world"
            ],
            "name": "lufy"
        },
        {
            "age": 16,
            "name": "zuoluo",
            "person": {
                "age": 16,
                "name": "nami"
            }
        }
    ]

*/
    //--------json数组添加数据方式1-----------
    //QJsonArray array = {1, 3.14, 3, true, "abc"};

    //--------json数组添加数据方式2-----------
    QJsonArray array;
    array.append(QJsonValue(true));        // 添加bool 数据
    array.append(QJsonValue(3.14));        // 添加double 数据
    array.append(QJsonValue(3));         // 添加int数据
    array.append(QJsonValue("abc"));       // 添加Qstring数据

    QJsonArray subArray = {"subArr", 123, 456};
    array.append(QJsonValue(subArray));      //添加到数组之前必须添加完subArray的元素,不然不会生成

    //---------json对象添加方式1-----------
    QJsonObject obj1
    {
        {"name", "lufy"},
        {"age", 16}
    };
    //----------json对象添加数组-----------
    QJsonArray arr1 = {"hello", "world"};
    obj1.insert("details",arr1);

    array.append(QJsonValue(obj1));//添加到数组之前必须添加完obj1的元素,不然不会生成

    //----------json对象添加方式2-----------
    QJsonObject obj2;
    obj2.insert("name", "zuoluo");
    obj2.insert("age", 16);

    //----------json对象添加对象-----------
    QJsonObject obj3
    {
        {"name", "nami"},
        {"age", 16}
    };
    obj2.insert("person", obj3);

    array.append(QJsonValue(obj2));//添加到数组之前必须添加完obj2的元素,不然不会生成


    //添加到文档对象
    m_doc.setArray(array);

    QString strJaon(m_doc.toJson(QJsonDocument::Indented).constData());// json转Qstring,indented表示转为可读格式(有换行、缩进)

    ui->json_txt->setText(strJaon);
}

/**
 * @brief MainWindow::fromJson 解析JSON
 */
void MainWindow::fromJson()
{
    QString path = QFileDialog::getOpenFileName(this, "打开JSON文件", "./", "Json文件 (*.json)");
    if(path.isEmpty())
        return;

    // 打开JSON文件
    QFile file(path);
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        qWarning() << "打开文件失败!";
        return;
    }

    // 读取json数据
    QByteArray arr = file.readAll();
    file.close();
    if(arr.isEmpty())
        return;

    QJsonParseError err;
    QJsonDocument doc = QJsonDocument::fromJson(arr, &err);
    if(doc.isEmpty())
    {
        qWarning() << err.errorString();//打印失败信息
    }

    if(doc.isArray())// 如果json数据为数组类型
    {
        jsonParse(QJsonValue(doc.array()));
    }
    else if(doc.isObject())  // 如果Json数据为对象类型
    {
        jsonParse(QJsonValue(doc.object()));
    }
}

/**
 * @brief MainWindow::save 保存为文件
 */
void MainWindow::save()
{
    if(m_doc.isEmpty()) // 如果没有json数据则不保存
        return;

    QString path = QFileDialog::getSaveFileName(this, "保存JSON数据", "test.json", "Json文件 (*.json)");
    if(path.isEmpty())
        return;

    // 将json数据保存到文件
    QFile file(path);
    if(file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        file.write(m_doc.toJson(QJsonDocument::Indented));
        file.close();
    }
    else
    {
        qWarning() << "保存JSON数据失败!";
    }
}

/**
 * @brief MainWindow::parse 解析JSON数据
 * @param value
 */
void MainWindow::jsonParse(const QJsonValue &value)
{
    switch (value.type())
    {
        case QJsonValue::Null:
        {
            break;
        }
        case QJsonValue::Bool:
        {
            break;
        }
        case QJsonValue::Double:
        {
            break;
        }
        case QJsonValue::String:
        {
            break;
        }
        case QJsonValue::Array:
        {
            QJsonArray arr = value.toArray();
            foreach(auto v , arr)   // 遍历数组
            {
                jsonParse(v);   // 使用递归的方式解析数组内容
            }
            break;
        }
        case QJsonValue::Object:
        {
            QJsonObject obj = value.toObject();
            QStringList keys = obj.keys();// 获取所有的键
            foreach(auto key , keys)
            {
                jsonParse(obj[key]); // 通过键获取数据
                //jsonParse(obj.take(key));
            }
            break;
        }
        case QJsonValue::Undefined:
        {
            break;
        }
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于在Qt中进行JSON数据解析,您可以使用Qt提供的QJsonDocument和QJsonObject类来实现。下面是一个简单的示例代码,演示了如何解析JSON数据: ```cpp #include <QCoreApplication> #include <QJsonDocument> #include <QJsonObject> #include <QJsonArray> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 示例JSON数据 QByteArray jsonData = R"( { "name": "John", "age": 30, "city": "New York", "languages": ["C++", "Python", "JavaScript"] })"; // 解析JSON数据 QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData); if (!jsonDoc.isNull()) { if (jsonDoc.isObject()) { QJsonObject jsonObj = jsonDoc.object(); // 获取字段值 QString name = jsonObj["name"].toString(); int age = jsonObj["age"].toInt(); QString city = jsonObj["city"].toString(); // 获取数组值 QJsonArray languagesArray = jsonObj["languages"].toArray(); QStringList languages; for (const QJsonValue& value : languagesArray) { languages.append(value.toString()); } // 打印结果 qDebug() << "Name:" << name; qDebug() << "Age:" << age; qDebug() << "City:" << city; qDebug() << "Languages:" << languages; } } return a.exec(); } ``` 在这个示例中,我们首先创建了一个QByteArray来存储JSON数据。然后,我们使用QJsonDocument::fromJson()方法将JSON数据转换为QJsonDocument对象。接下来,我们判断QJsonDocument对象是否为有效的JSON对象,并使用QJsonObject类获取字段值和数组值。 希望这个示例能对您有所帮助!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值