【QT 读取JSON】 深入浅出 使用QT内置的QJson模块解析Json文件 匠心之作

news2024/9/24 17:20:17

目录

  • 0 引言
  • 1 Json数据分析
  • 2 解析Json数据

请添加图片描述

  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:QT专栏
  • 💥 标题:【QT 读取JSON】 使用QT内置的QJson模块解析Json文件
  • ❣️ 寄语:人生的意义或许可以发挥自己全部的潜力,所以加油吧!
  • 🎈 最后:文章作者技术和水平有限,如果文中出现错误,希望大家能指正

0 引言

在项目开发过程中,经常会遇到读写Json文件的需求,掌握Json文件的操作是基础中的基础。

1 Json数据分析

要读取的Json数据格式如下:

[
        {
            "name":"ggr",
            "info":
                {
                    "age":21,
                    "height":174
                }
        },
        {
            "name":"lbw",
            "info":
                {
                    "age":21,
                    "height":174
                }
        }
]

接下来以QJson模块的角度,来解析这个Json数据

整个文件数据可以转换为 QJsonDocument 类型,其中有 “[ ]” 方括号、 "{ }“花括号、” : "冒号。

  • 被 “[ ]” 方括号包围的数据是QJsonArray数组类型
  • 被 "{ }"花括号包围的数据是QJsonObject对象类型
  • " : "冒号两侧的分别是Key和Value(key : value),冒号左右有空格不影响数据读取。

先了解四个重要的类型

  • QJsonDocument类型,指的是整个Json数据。
  • QJsonArray数组类型的元素QJsonValue类型。
  • QJsonObject类型的元素键值对,也就是 Key: Value 类型。Key字符串类型,Value 的类型是 QJsonValue
  • QJsonValue类型 可以转换成 QJsonObject 类型、int型、double型、QString类型、QJsonArray类型等基础数据类型。

总结:QJsonDocument 可以转换为 QJsonArray 或QJsonObjec t类型。然后 QJsonArray 中的元素和 QJsonObject 中键值对的值的类型都是 QJsonValue 类型。QJsonValue 类型可以转换成QJsonArray、QJsonObject、int、double、QString、bool等类型。(相当于闭环了,设计的非常巧妙)

2 解析Json数据

  1. 首先添加一些头文件
#include <QFile>				// 用于打开文件
#include <QJsonParseError>		// 返回错误信息
#include <QJsonArray>			// Json数据对象
#include <QJsonDocument>		// Json文档对象
#include <QJsonObject>			// 普通Json对象
#include <QDebug>				// 打印数据
  1. 新建一个函数解析Json数据
bool ReadJson::praseJsonFile(const QString &sJsonPathFn)
{
    //---------------------------------------------------------------------------------------------
    //1.读取磁盘中的文件
    QFile file( sJsonPathFn );
    if (!file.open(QIODevice::ReadOnly)) return false;

    QJsonParseError result;
    QJsonDocument   root_Doc = QJsonDocument::fromJson(file.readAll(), &result);    // 将文件数据格式化为JsonDocument对象
    if( result.error != QJsonParseError::NoError ) return false;                    // 数据格式错误就返回
    //---------------------------------------------------------------------------------------------

    QJsonArray roots = root_Doc.array();   // 将JsonDocument对象转换为QJsonArray类型

    //---------------------------------------------------------------------------------------------
    //2.遍历QJsonArray数组
    for (int i=0; i<roots.size(); i++)
    {
        QJsonObject root = roots.at(i).toObject();

        // 读取name和info的值
        QString     name    = root.value("name").toString();
        QJsonObject info    = root.value("info").toObject();

        // 读取info对象中age和height的值
        int         age     = info.value("age").toInt();
        int         height  = info.value("height").toInt();

        // 打印读取的数据
        qDebug() << "name = " << name;
        qDebug() << "info.age = " << age;
        qDebug() << "info.height = " << height;
    }
    //---------------------------------------------------------------------------------------------

    return true;
}

其实只要掌握关键的函数,就能看懂上面的代码

  • readAll()
    这是将文本文件读取成 QByteArray 类型的函数
  • QJsonDocument的fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR)函数
    这是将 QByteArray 类型的字符数组转换成 QJsonDocument 类型的函数。
  • QJsonDocument 有两个函数,分别是 object() 和 array() 函数,它们可以将自己转换成 QJsonArray 类型或者 QJsonObject 类型
    使用 object() 还是 array() 函数就看Json数据最开头的是 方括号 还是 花括号 ,本文数据是方括号开头,所以使用的是 array() 函数。
  • QJsonArrayat(int index) 函数,用于访问数组索引等于 index 的元素。
  • QJsonObjectvalue(const QString &key) 函数,用于读取花括号中的键值对的值。根据key的值,读取value的值。
    该函数返回的是 QJsonValue 类型
  • QJsonValue 中的 toObject、toString、toInt、toDouble、toBool、toArray 函数用于将 QJsonValue 装换为 QJsonObject、QString、int、double、bool、QJsonArray 类型

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

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

相关文章

大中小企业自招人力及劳务派遣全行业招聘来抖音招聘流量大效果佳

抖音直播招聘报白是通过抖音直播方式展现职位信息&#xff0c;并与求职者进行互动的招聘方式。在抖音平台上&#xff0c;企业或者人力资源公司可以通过直播的形式&#xff0c;将职位以视频直播的方式展现出来。通过抖音直播招聘报白&#xff0c;企业或者人力资源公司可以利用抖…

英语——分享篇——每日200词——1601-1800

1601——starve——[stɑːv]——vi.挨饿&#xff0c;饿——starve——star星星(熟词)ve维E(谐音)——星星吃了维E就不用挨饿——We gave them bread, lest they should starve.——我们给他们面包&#xff0c;以免他们饿死。 1602——blossom——[blɒs(ə)m]——vi.开花&…

新手如何找到Docker容器(redis)中的持久化文件?

具体步骤 要查看Docker容器的dump.rdb和appendonly.aof文件&#xff08;如果启用了AOF持久化&#xff09;的位置&#xff0c;我们需要知道容器中Redis配置文件的内容或者容器的数据卷的挂载位置。 这里是一般步骤&#xff1a; 查找容器的数据卷挂载位置 使用docker inspect命令…

MySQL的索引——索引的介绍及其数据结构B+树 索引的类型 索引的使用及其失效场景 相关名词解释

前言 索引是存储引擎用于快速查找数据纪录的一种数据结构&#xff0c;索引是数据库中经常提及的一个词&#xff0c;究竟什么是索引&#xff0c;索引的数据结构是什么&#xff0c;索引有什么类型&#xff1f; 本篇博客尝试阐述数据库索引的相关内容&#xff0c;涉及什么是索引…

【Java基础面试二十】、介绍一下Object类中的方法

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;介绍一下Object类中的方…

实验室如何用超声波清洗机萃取

实验室如何用超声波清洗机萃取&#xff1f;其实很多人不知道&#xff0c;超声波清洗机除去可用于清洗之外&#xff0c;还被广泛地应用于药物、食品、工业原料等无机或有机组分的萃取。实验室中使用超声波机来进行萃取&#xff0c;是近年来随着超声波技术的发展而起来的一种新型…

深度解析自动化测试流程(纯干货)

最近很多小伙伴咨询自动化测试到底该怎么做&#xff1f;流程是什么样的&#xff1f;在每个阶段都需要注意什么&#xff1f;本文也就主要从自动化测试的基本流程入手&#xff0c;对面试自动化测试工程师的同学会有不少帮助。对于在职的朋友&#xff0c;也可以参考此流程&#xf…

OpenP2P实现内网穿透远程办公

OpenP2P是一个开源、免费、轻量级的P2P共享网络。你的设备将组成一个私有P2P网络&#xff0c;里面的设备可以直接访问其它成员&#xff0c;或者通过其它成员转发数据间接访问。如果私有网络无法完成通信&#xff0c;将会到公有P2P网络寻找共享节点协助通信。 相比BT网络用来共享…

励志公式计算验证(用C++和Python实现)

励志公式计算验证&#xff08;用C和Python实现&#xff09; 成功是一个过程&#xff0c;在这个过程中需要你坚持比别人多付出一点点&#xff01;请看某学校的励志公式&#xff1a; 乘方是一种数学运算&#xff0c;表示将一个数&#xff08;底数&#xff09;连乘若干次&#xf…

FTP的魅力:构建高效的文件传输基础

1 ftp介绍 1.1 ftp服务器安装 dnf install vsftpd-3.0.3-31.el8.x86_64 -y # 安装ftp服务 systemctl enable --now vsftpd # 启动ftp服务 systemctl stop --now firewalld.service # 关闭防火墙&#xff0c;允许客户端访问anonymous_enableYES #启动匿名用户访问功能1.2 客户…

Linux —— 网络基础(一)

目录 一&#xff0c;计算机网络背景 二&#xff0c;网络协议初识 三&#xff0c;网络传输基本流程 四&#xff0c;网络中的地址管理 一&#xff0c;计算机网络背景 网络发展 独立模式&#xff0c;计算机之间相互独立&#xff1b;网络互联&#xff0c;多台计算机连接在一起…

解决电脑出现msvcp140.dll丢失问题,msvcp140.dll丢失的详细解决方法

在我们日常使用电脑的过程中&#xff0c;可能会遇到各种问题&#xff0c;其中之一就是MSVCCP140.DLL文件缺失。这个文件是Microsoft Visual C 2015 Redistributable的一部分&#xff0c;通常用于支持一些软件或游戏运行。如果这个文件丢失或损坏&#xff0c;可能会导致程序无法…

[已解决]Unable to connect to broker 0

[已解决]Unable to connect to broker 0 问题 Unable to connect to broker 0 kafka tool 工具无法查看主题 思路 在window的hosts添加上kafka服务器的ip和对应的域名 解决 成功解决&#xff01;

无人机UAV目标检测与跟踪(代码+数据)

前言 近年来&#xff0c;随着无人机的自主性、灵活性和广泛的应用领域&#xff0c;它们在广泛的消费通讯和网络领域迅速发展。无人机应用提供了可能的民用和公共领域应用&#xff0c;其中可以使用单个或多个无人机。与此同时&#xff0c;我们也需要意识到无人机侵入对空域安全…

Windows 端口被占

Windows 端口被占 # 查看所有端口号 netstat -ano# 查看特定端口号 如&#xff1a;13800 netstat -aon|findstr :8800# 查询这个进程的信息 tasklist | findstr "19396"# 关闭占用端口号的进程 # 根据进程号杀死进程 taskkill /T /F /PID 19396 # 这里的19396 为PI…

接口测试详解

为什么要做接口测试&#xff1f; 在公司里&#xff0c;客户端和服务端通常是由不同的团队开发的&#xff0c;在项目开发过程中&#xff0c;客户端和服务端开发的进度不一致&#xff0c;比如服务端先开发完了&#xff0c;这个时候可以先对服务端进行接口测试&#xff0c;确保服…

Kerberos认证协议介绍

概述 官网&#xff1a;https://www.kerberos.org/ 官方文档&#xff1a;http://web.mit.edu/kerberos/krb5-current/doc/ 为TCP/IP网络系统设计的可信的第三方身份认证协议。网络上的Keberos服务基于DES对称加密算法&#xff0c;但也可以用其他算法替代。因此&#xff0c;Keb…

CUDA学习笔记5——CUDA程序错误检测

CUDA程序错误检测 所有CUDA的API函数都有一个类型为cudaError_t的返回值&#xff0c;代表了一种错误信息&#xff1b;只有返回cudaSuccess时&#xff0c;才是成功调用。 cudaGetLastError()用来检测核函数的执行是否出错cudaGetErrorString()输出错误信息 #include <stdi…

minio public桶禁止默认访问权限

问题产生原因: 桶具有公共读写权限,直接访问桶会遍历出桶下所有目录与文件,可能会造成数据泄露。 解决方案: 修改匿名访问策略,需使用mc客户端,对minio进行修改 (高版本可通过自定义策略进行修改) 下载: wget https://dl.min.io/client/mc/release/linux-amd64/mc远程连接…