Qt-Web混合开发-Qt读写Json数据(5) 原创
Qt-Web混合开发-Qt使用内置json库读写json示例🍏
更多精彩内容 |
---|
👉个人内容分类汇总 👈 |
👉Qt - Web混合开发👈 |
1、概述🍓
- Qt版本:V5.12.5
- JSON: JavaScript Object Notation(JavaScript 对象表示法);
- JSON是一种轻量级的数据交换格式。易于人阅读和编写,类似 XML,比 XML 更小、更快,更易解析;
- JSON是一种对源自Javascript的对象数据进行编码的格式,现在在互联网上被广泛用作数据交换格式;
- 现在很多配置文件也喜欢使用JSON格式而不是使用Ini,例如:VSCode的配置文件就是JSON格式,便于阅读,结构清晰、可以添加注释信息。
- Qt提供了JSON读写的API,使用起来非常方便(虽然性能相较于常用的JSON库会差一些),在这个示例中演示了如何使用Qt自带的JSON库【QJsonArray、QJsonDocument、QJsonObject、QJsonValue】读写JSON数据。
- QJsonDocument:提供了一种读写JSON文档的方法;
- QJsonArray:用于读写JSON数组类型数据,例如:
[123, 456, "abc"]
;- QJsonObject:用于读写JSON对象类型数据(键值对),QJsonObject可以转换为QVariantMap,也可以从QVariantMap转换;
- QJsonValue:用于封装JSON值,支持Null、Bool、Double、String、Array、Object、Undefined六种类型数据;
2、实现效果🍅
3、实现功能🥝
- 实现生成json数据,插入json数组、json对象以及各种json支持的数据类型;
- 将json数据保存到json文件中;
- 从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•˶) ( •ω• ) ( •⤙• )
ଘ(ა🍱) (ა🍙૮)。 (🍜٩ )੭