热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

QtWeb混合开发Qt读写Json数据(5)

Qt-Web混合开发-Qt使用内置json库读写json示例🍏文章目录Qt-Web混合开发-Qt使用内置json库读写json示例🍏1、概述


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

文章目录


  • Qt-Web混合开发-Qt使用内置json库读写json示例🍏
    • 1、概述🍓
    • 2、实现效果🍅
    • 3、实现功能🥝
    • 4、关键代码🌽
    • 5、源代码🍆




更多精彩内容
👉个人内容分类汇总 👈
👉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
#include
#include
#include
#include
#include
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
#include
#include
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);
}
/**
* &#64;brief 将json数据保存到文件中
*/

void Widget::on_but_save_clicked()
{
if(m_doc.isEmpty()) return; // 如果没有json数据则不保存 isEmpty和isNull一样
QString strName &#61; QString("./%1.json").arg(QTime::currentTime().toString("HH-mm-ss"));
QString path &#61; 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 &#61; QJsonDocument(); // 清空
file.close();
}
else
{
qWarning() << "保存失败&#xff01;";
}
}
/**
* &#64;brief 从文件中读取json数据并解析
*/

void Widget::on_but_parse_clicked()
{
QString path &#61; QFileDialog::getOpenFileName(this, "打开json文件", "./", "Json文件 (*.json)");
if(path.isEmpty()) return;
// 将json数据保存到文件
QFile file(path);
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
qWarning() << "打开文件失败&#xff01;";
return;
}
// 读取json数据
QByteArray arr &#61; file.readAll();
file.close();
if(arr.isEmpty()) return;
QJsonParseError err;
QJsonDocument doc &#61; 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
{
}
}
/**
* &#64;brief json解析&#xff0c;假定不知道json数据的结构&#xff0c;那么通过递归来解析就很不错
* &#64;param value
*/

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

5、源代码&#x1f346;


  • gitee
  • github

/_/\ (\ __ /) A__A
( ˶•o•˶) ( •ω• ) ( •⤙• )
ଘ(ა&#x1f371;) (ა&#x1f359;૮)&#xff61; (&#x1f35c;٩ )੭







推荐阅读
author-avatar
吻过彩虹的脸_378
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有