Qt-Web混合开发-Qt读写Json数据(5) 原创

Qt-Web混合开发-Qt使用内置json库读写json示例🍏

更多精彩内容
👉个人内容分类汇总 👈
👉Qt - Web混合开发👈

1、概述🍓

  • Qt版本:V5.12.5
  1. JSON: JavaScript Object Notation(JavaScript 对象表示法);
  2. JSON是一种轻量级的数据交换格式。易于人阅读和编写,类似 XML,比 XML 更小、更快,更易解析;
  3. JSON是一种对源自Javascript的对象数据进行编码的格式,现在在互联网上被广泛用作数据交换格式;
  4. 现在很多配置文件也喜欢使用JSON格式而不是使用Ini,例如:VSCode的配置文件就是JSON格式,便于阅读,结构清晰、可以添加注释信息。
  5. Qt提供了JSON读写的API,使用起来非常方便(虽然性能相较于常用的JSON库会差一些),在这个示例中演示了如何使用Qt自带的JSON库【QJsonArray、QJsonDocument、QJsonObject、QJsonValue】读写JSON数据。
    1. QJsonDocument:提供了一种读写JSON文档的方法;
    2. QJsonArray:用于读写JSON数组类型数据,例如:[123, 456, "abc"]
    3. QJsonObject:用于读写JSON对象类型数据(键值对),QJsonObject可以转换为QVariantMap,也可以从QVariantMap转换;
    4. QJsonValue:用于封装JSON值,支持Null、Bool、Double、String、Array、Object、Undefined六种类型数据;

2、实现效果🍅

在这里插入图片描述

3、实现功能🥝

  1. 实现生成json数据,插入json数组、json对象以及各种json支持的数据类型;
  2. 将json数据保存到json文件中;
  3. 从json文件中读取json数据,并使用【递归】的方式解析json数据。

4、关键代码🌽

  • widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

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

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    void jsonParse(const QJsonValue& value);

private slots:
    void on_but_create_clicked();
    
    void on_but_parse_clicked();
    
    void on_but_save_clicked();

private:
    Ui::Widget *ui;

    QJsonDocument m_doc;    // 创建一个用于读写json的对象
};
#endif // WIDGET_H

  • widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QFileDialog>
#include <QTime>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setWindowTitle(QString("Qt使用内置库读写Json简单示例 - V%1").arg(APP_VERSION));  // 设置窗口标题
}

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


/**
 * @brief 生成json
 */
void Widget::on_but_create_clicked()
{
    // json数组添加数据方式1
    QJsonArray array = {1, 2, 3, 4, "123"};

    // json数组添加数据方式2
    array.append(QJsonValue(true));        // 添加bool 数据
    array.append(QJsonValue(1.23));        // 添加double 数据
    array.append(QJsonValue(123));         // 添加int数据
    array.append(QJsonValue("abc"));       // 添加Qstring数据
    QJsonArray array1 = {111, 222, 333};
    array.append(QJsonValue(array1));      // 添加数组数据
    QJsonObject obj1   // json对象添加【键值对】方式 1
    {
        {"键值1", 1},
        {"键值2", 2}
    };
    array.append(QJsonValue(obj1));        // 添加JSON对象数据

    QJsonObject obj2;
    // json对象添加【键值对】方式2
    obj2.insert("键值0", array);

    m_doc.setObject(obj2);
    QString strJaon(m_doc.toJson(QJsonDocument::Indented).constData());   // json转Qstring,indented表示转为可读格式(有换行、缩进)
    ui->textEdit->append("<------------- 生成json ------------->");
    ui->textEdit->append(strJaon);
}

/**
 * @brief  将json数据保存到文件中
 */
void Widget::on_but_save_clicked()
{
    if(m_doc.isEmpty()) return;    // 如果没有json数据则不保存 isEmpty和isNull一样

    QString strName = QString("./%1.json").arg(QTime::currentTime().toString("HH-mm-ss"));
    QString path = QFileDialog::getSaveFileName(this, "json数据保存到", strName, "Json文件 (*.json)");
    if(path.isEmpty()) return;

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

/**
 * @brief 从文件中读取json数据并解析
 */
void Widget::on_but_parse_clicked()
{
    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())   // 如果加载json数据失败则打印失败信息
    {
        qWarning() << err.errorString();
    }

    ui->textEdit->append("<------------- 解析json ------------->");
    if(doc.isArray())        // 如果json数据为数组类型
    {
        jsonParse(QJsonValue(doc.array()));
    }
    else if(doc.isObject())  // 如果Json数据为对象类型
    {
        jsonParse(QJsonValue(doc.object()));
    }
    else
    {
    }
}

/**
 * @brief       json解析,假定不知道json数据的结构,那么通过递归来解析就很不错
 * @param value
 */
void Widget::jsonParse(const QJsonValue &value)
{
    // 这里可以使用type() 函数,也可以使用isNull()、isBool()等函数
    switch (value.type())
    {
    case QJsonValue::Null:
    {
        break;
    }
    case QJsonValue::Bool:
    {
        ui->textEdit->append(QString("bool类型数据:%1").arg(value.toBool()));
        break;
    }
    case QJsonValue::Double:
    {
        ui->textEdit->append(QString("double类型数据:%1").arg(value.toDouble()));
        break;
    }
    case QJsonValue::String:
    {
        ui->textEdit->append(QString("字符串类型数据:%1").arg(value.toString()));
        break;
    }
    case QJsonValue::Array:
    {
        ui->textEdit->append("数组:------------- start");
        QJsonArray arr = value.toArray();
        for(auto v : arr)   // 遍历数组
        {
            jsonParse(v);   // 使用递归的方式解析数组内容
        }
        ui->textEdit->append("数组:------------- end");
        break;
    }
    case QJsonValue::Object:
    {
        ui->textEdit->append("对象:------------- start");
        QJsonObject obj = value.toObject();
        QStringList keys = obj.keys();        // 获取所有的键值
        for(auto key : keys)
        {
            ui->textEdit->append(QString("键值:%1").arg(key));
            jsonParse(obj[key]);           // 通过键值获取数据,并调用解析函数递归解析
//            jsonParse(obj.take(key));    // 使用toke和使用[]效果一样
        }
        ui->textEdit->append("对象:------------- end");
        break;
    }
    case QJsonValue::Undefined:
    {
        break;
    }
    }
}

5、源代码🍆

/_/\ (\ __ /) A__A
( ˶•o•˶) ( •ω• ) ( •⤙• )
ଘ(ა🍱) (ა🍙૮)。 (🍜٩ )੭

posted @ 2024-08-10 19:44  mahuifa  阅读(0)  评论(0编辑  收藏  举报  来源