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

news2025/1/23 11:29:49

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 <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、源代码🍆

  • gitee
  • github

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/92355.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试怎么回答MySQL索引问题,看这里

前言 小A在宿舍里跟哥们开五黑打排位中&#xff0c;突然收到女神小美的消息&#xff1a;“小A&#xff0c;我今天面试碰到索引问题了&#xff0c;我没回答好”。小A顾不上游戏抓紧回复到&#xff1a;“到你宿舍某某咖啡店吧&#xff0c;我帮你一起看下”。 小A抓紧时间换了衣…

物联公司网页设计制作 简单静态HTML网页作品 静态企业网页作业成品 学生网站模板

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Linux系统部署

Linux系统部署 下载vmware centos7 xshell6 xftp6新建虚拟机&#xff0c;注意设置网络连接&#xff0c;设置登录名&#xff1a;root,密码&#xff1a;root,等待登录&#xff0c;输入用户名和密码&#xff08;注意密码输入不显示&#xff09;登录成功&#xff0c;执行命令Ifc…

【网管日记】MySQL主从复制

MySQL主从复制 基本介绍 MySQL 主从复制是一个异步的复制过程&#xff0c;底层是基于 Mysql 数据库自带的 二进制日志 功能。 一台或多台 MySQL 数据库&#xff08;slave&#xff0c;即 从库 &#xff09;从另一台 MySQL 数据库&#xff08; master&#xff0c;即 主库 &…

餐饮后台管理系统

一、项目介绍&#xff1a; 用于每天的菜品数据分析&#xff0c;客户的管理&#xff0c;员工的管理&#xff0c;查看订单信息&#xff0c;菜品的添加或者下架管理 二、项目使用技术栈&#xff1a; vue2全家桶、element-ui、axios、js、es6、echarts 三、主页效果图&#xff…

pytorch深度学习实战一书,tensorboard可视化踩坑

书评&踩坑[TOC](书评&踩坑) 提示&#xff1a;纯个人观点&#xff0c;仅供参考前言一、源码学习&#xff0c;又是版本问题&#xff08;省略内心独白...&#xff09;二、步骤1.安装tensorflow2.思考&#xff0c;看代码&#xff0c;看书求证总结提示&#xff1a;纯个人观点…

卧兔CEO胡煜受邀参加2022世界直播电商大会

首届全球数字贸易博览会于12月11日在国际博览中心盛大开幕。在这个国家级、全球性、专业性的舞台上&#xff0c;“2022世界直播电商大会”作为分论坛&#xff0c;精彩启幕。 “2022世界直播电商大会”由浙江省人民政府和商务部联合主办&#xff0c;杭州市人民政府和浙江省商务…

借款久期还款久期 简述

借款久期&还款久期 简述 在工作的时候&#xff0c;在资产使用遇到三个指标&#xff0c;分别是生息资产、借款久期、还款久期&#xff0c;有点不清楚其中的含义&#xff0c;查阅相关资料后做个简短的总结&#xff0c;可能有错&#xff0c;先放这。 1 久期 久期&#xff0…

【STM32】GPIO的工作原理和配置

目录一、GPIO是什么&#xff1f;二、GPIO的8种工作模式1. 浮空输入模式&#xff08;GPIO_Mode_IN_FLOATING&#xff09;2. 上拉输入模式&#xff08;GPIO_Mode_IPU&#xff09;3. 下拉输入模式&#xff08;GPIO_Mode_IPD&#xff09;4. 模拟输入模式&#xff08;GPIO_Mode_AIN&…

kubernetes学习之路--BadPods(Part2)

在我看来&#xff0c;现在关于k8s的攻击面很小&#xff0c;除了容器逃逸&#xff0c;敏感信息和配置不当&#xff0c;很难有其他有效的横向移动的手段了吧&#xff0c;反正据我了解暂时是这样子的&#xff0c;慢慢积累吧还是。 回顾一下Pod中那几项不安全的配置 &#xff1a; …

原地起飞,华为内部都在强推的435页网络协议文档,附讲解

#为什么要学习网络协议&#xff1f; 相信大家都听过通天塔的故事&#xff0c;上帝为了阻止人类联合起来&#xff0c;让人类说不同的语言&#xff0c;人类没法沟通&#xff0c;达不成“协议”&#xff0c;通天塔的计划就失败了。 但是千年以后&#xff0c;有一种叫“程序猿”的…

基于VBA实现电缆结构自动出图(三) —— 多芯线

大家敢相信吗&#xff0c;原来VBA竟然可以实现电缆结构自动出图&#xff0c;换句话说&#xff0c;只要输入数据&#xff0c;VBA会自动将电缆的结构画出来&#xff0c;同时还可以渲染&#xff0c;结果竟然不输画图软件&#xff0c;真真让我刮目相看。这里我就不过多介绍VBA了&am…

重点| 系统集成项目管理工程师考前50个知识点(5)

本文章总结了系统集成项目管理工程师考试背记50个知识点&#xff01;&#xff01;&#xff01; 帮助大家更好的复习&#xff0c;希望能对大家有所帮助 比较长&#xff0c;放了部分&#xff0c;需要可私信&#xff01;&#xff01; 30、活动之间的四种依赖关系&#xff1a; 强…

[附源码]Node.js计算机毕业设计高校互联网班级管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

Redis 压力测试 服务监控

Redis 压力测试 & 服务监控 Redis 压力测试 Redis 安装成功后&#xff0c;会在 /usr/local/bin/目录下生成redis-benchmark压测工具。该工具模拟N个客户端同时执行Redis指令&#xff0c;默认提供一组默认测试参数&#xff0c;用户可以自定义其属性&#xff0c;更改测试行…

java开发必备技能:mysql

mysql 架构 连接器 mysql的连接器负责处理mysql客户端的连接请求及维护连接。 传输协议 mysql支持多种传输协议&#xff0c;不同的平台可以选择不同的协议&#xff1a; 连接压缩控制 mysql建立的连接可以对客户端和服务器之间的流量进行压缩&#xff0c;以减少通过连接发…

Rock派(基于瑞芯微RK3308B)开发记录-上篇

本文作者&#xff1a;Linux兵工厂&#xff0c;一个嵌入式软件领域的攻城狮。欢迎指教公一众-号&#xff1a;Linux兵工厂&#xff0c;获取硬核Linux资料和文章 前言 根据项目需求并且经过各方面评估最终选择了这款Rock Pi(Rock派)系列中的Rock Pi S产品。正式它的各方面的特性…

马士兵-郑金维—并发编程—6.JUC并发工具

JUC并发工具 一、CountDownLatch应用&源码分析 1.1 CountDownLatch介绍 CountDownLatch就是JUC包下的一个工具,整个工具最核心的功能就是计数器。 如果有三个业务需要并行处理,并且需要知道三个业务全部都处理完毕了。 需要一个并发安全的计数器来操作。 CountDown…

Web大学生网页作业成品 :黑色主题个人博客网站设计与实现(HTML+CSS+JavaScript)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

基于java+springmvc+mybatis+vue+mysql的农业信息管理系统

项目介绍 农业信息的需求和管理上的不断提升&#xff0c;农业信息管理的潜力将无限扩大&#xff0c;农业信息管理系统在业界被广泛关注&#xff0c;本系统对此进行总体分析&#xff0c;将农业信息管理的发展提供参考。农业信息管理系统对农业信息有着明显的带动效应&#xff0…