Qt中的JSON操作_3: JSON在Qt中的应用举例(写入和读出的关键是利用QJsonDocument实现Json格式的文件转换为字符串)

2023-11-10

接上篇:Qt中的JSON操作_2: JSON在Qt中的使用,本篇主要讲利用Json在Qt中封装的类实现读写文件的举例。

我们在Qt中的JSON操作_1: JSON的基本知识介绍中举了一个Json对象的例子,对象1中嵌入对象2,对象2中嵌入数组,对其进行读写操作。
在这里插入图片描述

1.将Json格式文件写入磁盘文件(序列化)

(1)代码:

#include "mainwindow.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QDebug>
#include <QFile>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{

    QJsonDocument doc;
    if(doc.isEmpty())
    {
        qDebug()<<"json document is empty...";
    }
    if(doc.isNull())
    {
        qDebug()<<"json document is null...";
    }

    writeJson();

}

MainWindow::~MainWindow()
{

}

/*
{
    "Name":"Ace",
    "Sex":"man",
    "Age":20,
    "Family":{
        "Father":"Gol·D·Roger",
        "Mother":"Portgas·D·Rouge",
        "Brother":["Sabo", "Monkey D. Luffy"]
    },
    "IsAlive":false,
    "Comment":"yyds"
}

*/

//Json对象内数据的写入,转换为Json文档对象
void MainWindow::writeJson()
{
    //上面的内容整体是在一个Json的对象中,因此先创建一个空Json对象
   QJsonObject obj;

   //在空Json对象中需要添加若干个键值对,使用inser方法
   //QJsonObject::iterator insert(const QString &key, const QJsonValue &value)
   //insert方法中第二个参数是QJsonValue "Ace"是一个字符串,由于QJsonValue中的构造函数有一个的参数是字符串类型
   //输入"Ace"之后就会自动调用参数是字符串的构造函数,对字符串进行构造,最终得到QJsonValue的对象,这种操作叫做隐式类型转换
   obj.insert("Name","Ace");
   obj.insert("Sex","man");
   obj.insert("Age",20);

   //由于内嵌的为一个子对象,因此需要重新构造一个子对象
   QJsonObject subObj;
   subObj.insert("Father","Gol·D·Roger");
   subObj.insert("Mother","Portgas·D·Rouge");

   //对于brother,其value是一个数组,需要创建一个数组
   QJsonArray array;
   array.append("Sabo");
   array.append("Monkey D. Luffy");
   subObj.insert("Brother",array);

   //插入子对象
   obj.insert("Family",subObj);

   obj.insert("IsAlive",false);
   obj.insert("Comment","yyds");

   //Json对象转换为Json文档对象
   QJsonDocument doc(obj);

   //将Json文档对象转换为字符串类型
   QByteArray json=doc.toJson();

   //构造QFile对象,关联一个磁盘文件
   QFile file("D:\\ace.json");
   //通过QFile对象打开关联的磁盘文件,打开方式为只写,返回值为一个Bool变量
   file.open(QFile::WriteOnly);

   //将字符串写入磁盘文件中
   file.write(json);
   file.close();

}

void MainWindow::readJson()
{

}

(2)运行结果

  • 程序中的QJsonDocument doc;为空对象,因此运行后报出为空
json document is empty...
json document is null...
  • 在生成的.json文件中,对于键值是按照升序的方式进行排序的,结果如下:
    在这里插入图片描述

    2.将Json文件从磁盘读出(Json格式字符串反序列化)


    反序列化即从Json格式字符串中得到原始数据的过程,其过程就是利用 QJsonDocument类将字符串 --> QJsonObject 或者 QJsonArray,再利用QJsonObject 或者 QJsonArray的方法取出相应值。

(1)代码:

#include "mainwindow.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QDebug>
#include <QFile>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{

    QJsonDocument doc;
    if(doc.isEmpty())
    {
        qDebug()<<"json document is empty...";
    }
    if(doc.isNull())
    {
        qDebug()<<"json document is null...";
    }

    writeJson();
    readJson();

}

MainWindow::~MainWindow()
{

}

/*
{
    "Name":"Ace",
    "Sex":"man",
    "Age":20,
    "Family":{
        "Father":"Gol·D·Roger",
        "Mother":"Portgas·D·Rouge",
        "Brother":["Sabo", "Monkey D. Luffy"]
    },
    "IsAlive":false,
    "Comment":"yyds"
}

*/

//Json对象内数据的写入,转换为Json文档对象
void MainWindow::writeJson()
{
    //上面的内容整体是在一个Json的对象中,因此先创建一个空Json对象
   QJsonObject obj;

   //在空Json对象中需要添加若干个键值对,使用inser方法
   //QJsonObject::iterator insert(const QString &key, const QJsonValue &value)
   //insert方法中第二个参数是QJsonValue "Ace"是一个字符串,由于QJsonValue中的构造函数有一个的参数是字符串类型
   //输入"Ace"之后就会自动调用参数是字符串的构造函数,对字符串进行构造,最终得到QJsonValue的对象,这种操作叫做隐式类型转换
   obj.insert("Name","Ace");
   obj.insert("Sex","man");
   obj.insert("Age",20);

   //由于内嵌的为一个子对象,因此需要重新构造一个子对象
   QJsonObject subObj;
   subObj.insert("Father","Gol·D·Roger");
   subObj.insert("Mother","Portgas·D·Rouge");

   //对于brother,其value是一个数组,需要创建一个数组
   QJsonArray array;
   array.append("Sabo");
   array.append("Monkey D. Luffy");
   subObj.insert("Brother",array);

   //插入子对象
   obj.insert("Family",subObj);

   obj.insert("IsAlive",false);
   obj.insert("Comment","yyds");

   //Json对象转换为Json文档对象
   QJsonDocument doc(obj);

   //将Json文档对象转换为字符串类型
   QByteArray json=doc.toJson();

   //构造QFile对象,关联一个磁盘文件
   QFile file("D:\\ace.json");
   //通过QFile对象打开关联的磁盘文件,打开方式为只写,返回值为一个Bool变量
   file.open(QFile::WriteOnly);

   //将字符串写入磁盘文件中
   file.write(json);
   file.close();

}

void MainWindow::readJson()
{
    //构造QFile对象,关联一个磁盘文件
    QFile file("D:\\ace.json");
    //通过QFile对象打开关联的磁盘文件,打开方式为只读,返回值为一个Bool变量
    file.open(QFile::ReadOnly);
    //将磁盘文件内容读入到字符串中
    QByteArray all=file.readAll();
    file.close();

    //读出的字符串转换为Json的文档对象
    QJsonDocument doc=QJsonDocument::fromJson(all);

    //判断读入的是读入的是对象还是数组,如果是对象就将对象读出来
    //大多数是不用判断的
    if(doc.isObject())
    {
        QJsonObject obj=doc.object();

        //Json对象中包含了很多键值对,需要按照键对出对应的Value

        //首先将Key值读入到一个List中
        QStringList keys=obj.keys();
        //对QStringList容器所有的Key值进行遍历
        for(int i=0;i<keys.size();++i)
        {
            //取出Key
            QString key=keys.at(i);
            //根据Key得到对应的Value值
            QJsonValue value=obj.value(key);

            //得到的Value可能是各种数据类型,进行判断,并打印出来
            if(value.isBool())
            {
                qDebug()<<key<<":"<<value.toBool();
            }
            else if(value.isString())
            {
                 qDebug()<<key<<":"<<value.toString();
            }
            else if(value.isDouble())
            {
                //实际使用的是int型的
                 qDebug()<<key<<":"<<value.toInt();
            }
            //Json格式的文件汇总包含一个子对象,因此还需要对其内部进行解析
            else if(value.isObject())
            {
                 qDebug()<<key<<":"<<value.toObject();

                 //得到一个子对象
                 QJsonObject subObj=value.toObject();
                 //获取所有的key的列表
                  QStringList subkeys=subObj.keys();
                  //进行遍历
                  for(int k=0;k<subkeys.size();++k)
                  {
                      QJsonValue subValue=subObj.value(subkeys.at(k));

                     if(subValue.isString())
                     {
                       qDebug()<<" "<<subkeys.at(k)<<":"<<value.toString();
                     }
                     else if(subValue.isArray())
                     {
                         QJsonArray array=subValue.toArray();

                         for(int j=0;j<array.size();++j)
                         {
                           qDebug()<<" "<<array[j].toString();
                         }
                     }
                  }
            }
        }

    }


}

(2)运行结果

qDebug输出,内容并不一定完全对,但思路是没有问题的

json document is empty...
json document is null...
"Age" : 20
"Comment" : "yyds"
"Family" : QJsonObject({"Brother":["Sabo","Monkey D. Luffy"],"Father":"Gol??D??Roger","Mother":"Portgas??D??Rouge"})
  "Sabo"
  "Monkey D. Luffy"
  "Father" : ""
  "Mother" : ""
"IsAlive" : false
"Name" : "Ace"
"Sex" : "man"

一般情况下,对于 Json 字符串的解析函数都是有针对性的,因为需求不同设计的 Json 格式就会有所不同,所以不要试图写出一个通用的 Json 解析函数,这样只会使函数变得臃肿而且不易于维护,每个 Json 格式对应一个相应的解析函数即可。

上面的例子中为了给大家演示 Qt 中 Json 类相关 API 函数的使用将解析步骤写的复杂了,因为在解析的时候我们是知道 Json 对象中的所有 key 值的,可以直接通过 key 值将对应的 value 值取出来,因此上面程序中的一些判断和循环其实是可以省去的。

声明: 本篇是在以下视频及链接基础上学习并稍微做了补充,感谢原博主!
学习视频地址:Json简介学习视频
学习笔记网址:笔记网址

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt中的JSON操作_3: JSON在Qt中的应用举例(写入和读出的关键是利用QJsonDocument实现Json格式的文件转换为字符串) 的相关文章

  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 如何检测QTableView中的双击

    我正在使用 PyQt 创建 GUI 应用程序 在继承自 QTableView 的视图中 需要检测用户双击行时选择的行 该表可以排序 但不能编辑 我该怎么做 注意 尝试了 doubleClicked int 信号 它是由鼠标按钮发出的 而不是
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 使用 Python 将对象列表转为 JSON

    我在转换时遇到问题Object实例到 JSON ob Object list name scaping myObj base url u number page for ob in list name json string json du
  • C# Newtonsoft 反序列化 JSON 数组

    我正在尝试使用 Newtonsoft 反序列化数组 以便我可以在列表框中显示来自基于云的服务器的文件 但无论我尝试什么 我总是会收到此错误 Newtonsoft Json JsonReaderException 解析值时遇到意外字符 路径
  • 从 Qt4 中的文本文件中逐字读取

    我想在 Qt4 中逐字读取一个文本文件 说实话我对它很陌生 我想在另一个文件中每行一个字写入 我可以在 C 中做到这一点 没有任何问题 但是当我尝试在 Qt4 中使用 ifstream 和 ofstream 时 我遇到了错误 这是我的 Qt
  • Qt 是否已经有了自己的 new 和 delete 运算符?

    我正在使用一个QGraphicsScene小部件并在其上显示一些点QGraphicsRectItem 这意味着要拨打很多电话new addItem 当出现时 并且removeItem delete摆脱未使用的点 当然 对于性能问题 我已经实
  • 根据 .NET Core 2.1 中的更改重新加载 Serilog JSON 配置

    我目前正在开发 ASP NET Core 2 1 应用程序 并使用 Serilog 进行日志记录 我想在运行时为我的 Serilog 实现重新加载应用程序设置文件 我的目标是在运行时更改日志级别 例如我写入minimumLevelDebug
  • 为什么 json.Unmarshal 返回映射而不是预期的结构?

    看看这个游乐场 http play golang org p dWku6SPqj5 http play golang org p dWku6SPqj5 基本上 我正在工作的图书馆收到了interface 作为参数 然后需要json Unma
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 全局传递 xhr onload 函数的值

    在我正在创建的应用程序中 我有以下 XMLHttpRequest 并且我正在尝试传递结果data在 的里面xhr onload 到在同一父函数中创建的数组中 var url http api soundcloud com resolve j
  • 包含 contains 的 json 格式查询

    我在 ansible 中有以下 json 输出 active transaction null cores 4 hostname alpha auth wb01 active transaction null cores 4 hostnam
  • jolt变换后json对象的排序

    Input The input json object 所需输出 Event1 Value1 Event2 collection of json objects Event3 The input json object 所以基本上输入 js
  • SQL Server OPENJSON读取嵌套json

    我有一些想要在 SQL Server 2016 中解析的 json 有一个项目 gt 结构 gt 属性的层次结构 我想编写一个解析整个层次结构的查询 但我不想通过索引号指定任何元素 即我不想做这样的事情 openjson json 0 or
  • SQL查询json字典数据

    我的表中的 CLOB 字段包含 JSON 如下所示 a value1 b value2 c value3 我正在尝试编写一个 SQL 查询来返回一个包含键和值字段的表 如下所示 key value a value1 b value2 c v
  • 为什么 QGraphicsWidget 的选择边框在 QGraphicsScene 中不可见?

    我已经通过一个小部件添加到图形场景 QGraphicSscene QGraphicsProxyWidget 问题是 当我选择该项目时 它被选中 但选择边框不可见 这是代码 QDial dial new QDial Widget dial g
  • 键绑定 - 鼠标中键与 Sublime Text 2

    有谁知道是否可以将鼠标中键绑定到 Sublime Text 2 中的操作 我知道可以进行一些鼠标交互 因为您可以使用后退和前进按钮 基本上 我将使用此按钮通过 sFTP 插件上传文件 这样我需要按下的按钮数量就会从 3 个减少到 1 个 目
  • 如何访问Loader的sourceComponent中的QML对象?

    我可能需要读取或写入的一些属性Loader s sourceComponent来自一些外部函数 访问该房产的方式是什么x里面的对象的Loader s sourceComponent import QtQuick 2 0 Item width
  • 通过标识引用对象的标准方法(例如循环引用)?

    JSON 中是否有通过身份引用对象的标准方法 例如 具有大量 可能是循环 引用的图形和其他数据结构可以被合理地序列化 加载吗 Edit 我知道做一次性解决方案很容易 列出图中所有节点的列表 然后 我想知道是否有一个标准的 通用的解决方案来解
  • 使用 json_encode() 函数在 PHP 数组中生成 JSON 键值对

    我正在尝试以特定语法获取 JSON 输出 这是我的代码 ss array 1 jpg 2 jpg dates array eu gt 59 99 us gt 39 99 array1 array name gt game1 publishe

随机推荐

  • Java环境变量的配置

    最近有朋友问到环境变量的配置 下面以Windows10系统为例进行Java环境变量配置说明 1 右键点击 此电脑 选择 属性 项 2 点击 高级系统设置 在弹出的系统属性框中 选择 高级 选项卡 默认即显示该选项卡 点击 环境变量 3 在弹
  • 回答问题:你认为AGI应该采用什么思路?

    我是研究AGI基础理论的 我认为AGI要突破首先要对智能的原理有突破 需要建立一套体系描述和解释智能 我认为目前的数学体系有很大的不足 限制了人类对智能的理解 所以需要改革 重新理解一些基础的东西 例如 空间的本质 计算的本质 我认为AGI
  • C++Opencv图像对象Mat的创建和赋值

    Mat中元素的类型以及矩阵的通道个数 它是一系列的预定义的常量 其命名规则为CV 位数 数据类型 通道数 因此在学习图像创建之前先了解一下基本的数据类型 S 有符号整型 U 无符号整型 F 浮点型 CV 8U 8位无符号整数 CV 8S 8
  • Windows CE嵌入式导航系统研究(内核相关)

    1 1 嵌入式车载导航系统的软件设计流程 嵌入式车载系统软件主要包括系统内核 驱动程序 应用程序三部分 设计的过程当中 我们采用瀑布模型进行设计 首先制定Windows CE5 0系统内核 再次编写相关设备驱动 最后编写或移植应用程序 制定
  • 软件测试实验二 白盒测试

    一 实验目的 1 掌握等逻辑覆盖测试法 2 掌握基本路径测试法 3 掌握基于Junit的单元测试 二 实验内容 1 为以下判断等级的程序段设计一组测试用例 要求分别满足语句覆盖 判定覆盖 条件覆盖 判断 条件覆盖 条件组合覆盖 public
  • 809协议nodejs编写笔记

    一 总体流程 数据首先通过receiver接受层接收 去掉标识头和标识尾 再进入depacker解包层进行解包 把标识头分解出来并解析 之后发给handler处理层根据不同的消息id选择使用不同的业务逻辑 如果有应答 则通过sender发送
  • 7.12 redis未授权访问漏洞

    在1 txt添加存在redis未授权访问漏洞的IP redis py输入脚本 redis cli exe h IP p 端口号
  • async/await 异步函数

    1 async异步函数的使用 await async写法 async function foo1 const foo2 async gt 2 async异步函数的执行流程 都是同步代码 跟普通函数代码没区别 async function f
  • RTP - 视频流广播

    这是用RTP RFC3350 按RFC2550封装MPEG ES流数据的发送程序 学习RTP的路真的辛苦 在网上收集的有关RTP的程序都是那种只负责RTP数据包发送的库 如jrtplib等 他们的DEMO 程序都只是用来发发字符串 编编聊天
  • mac mongodb Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols

    mac 下 mongodb 执行命令 mongod 报错 标题为报错的第一句 因为一般人百度的时候都是根据第一句百度 所以起的这个标题 具体报错如下图 我的具体信息如上 可以发现 报错的主要信息在于 没有找到 data 数据的存放路径导致的
  • 【华为OD统一考试A卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 【数据结构前置知识】初识集合框架和时间,空间复杂度

    文章目录 1 什么是集合框架 2 集合框架的重要性 3 背后所涉及的数据结构以及算法 3 1 什么是数据结构 3 2 容器背后对应的数据结构 3 3 相关java知识 3 4 什么是算法 4 时间复杂度 1 如何衡量一个算法的好坏 2 算法
  • js高级 6.闭包

    闭包的理解 如何产生闭包 当一个嵌套的内部 子 函数引用了嵌套的外部 父 函数的变量 或函数 时 就产生了闭包 闭包到底是什么 使用chrome浏览器查看 理解一 闭包是嵌套的内部函数 大多数人 理解二 包含被引用变量 或函数 的对象 极少
  • 进程与线程408

    文章目录 1 进程与线程 1 1 进程的概念与特征 1 2 进程的状态与转换 1 3 进程的组成 1 4进程控制 1 5 进程的通信 2 处理机调度 2 1 调度的基本概念 2 2 调度算法的评价指标 2 3 调度的实现 2 4 经典的调度
  • 单相电流型逆变电路

    电流型逆变电路 引言 电流型三相桥式逆变电路 直流电源为电流源的逆变电路称为电流型逆变电路 电流型逆变电路主要特点 直流侧串大电感 电流基本无脉动 相当于电流源 交流输出电流为矩形波 与负载阻抗角无关 输出电压波形和相位因负载不同而不同 直
  • C# DropDownList绑定添加新数据的几种方法

    第一种 在前台手动绑定 适用于固定不变的数据项
  • 第2课 微信开发者工具使用slider进度条标签编写rgb颜色选择功能:

    微信小程序编写rgb颜色选择功能 效果图如下 以下是wxml文件代码
  • 银行应用软件:零售银行业务中谁才是赢家

    资本界的谷歌 这就是杰里米 阿莱尔现在正在创建的 也就是 一家消费者金融公司 为消费者提供存款 寄款和收款产品 这些也是零售银行的基础公共设施 42 他 认为对任何有上网设备的人来说 这都是一个强大 实时及免费的服务 而他的区块链公司世可国
  • PHP微信公众开发笔记(一)

    笔记是先写在印象笔记上的 晚上没事的时候整理整理 PHP微信公众开发笔记系列 日期 2014 9 1 今天开始正式开始做班上的微信公众平台的开发者服务了 因为是第一次做这个 对PHP也不了解 所以一边学PHP 一边整理微信的公众平台 当做是
  • Qt中的JSON操作_3: JSON在Qt中的应用举例(写入和读出的关键是利用QJsonDocument实现Json格式的文件转换为字符串)

    接上篇 Qt中的JSON操作 2 JSON在Qt中的使用 本篇主要讲利用Json在Qt中封装的类实现读写文件的举例 我们在Qt中的JSON操作 1 JSON的基本知识介绍中举了一个Json对象的例子 对象1中嵌入对象2 对象2中嵌入数组 对