QT笔记---JSON
QT笔记---JSON
- JSON
- 1、JSON基本概念
- 1.1、判断.json文件工具
- 2、生成.json数据
- 3、解析.json数据
JSON
在现代软件开发中,数据的交换和存储格式至关重要。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,以其简洁易读、易于解析和生成的特点,被广泛应用于各种应用程序中。在 QT 框架下,处理 JSON 数据同样便捷高效。
本文参考链接:https://blog.csdn.net/qq_42432673/article/details/132115700
1、JSON基本概念
JSON 数据结构主要由两种类型构成:对象(object)和数组(array)。对象是由键值对组成的无序集合,键必须是字符串,值可以是字符串、数字、布尔值、null、对象或数组。数组则是值的有序集合,这些值同样可以是上述各种类型。例如:
{"address": {"city": "WuHan","street": "luck"},"age": "31","hobbies": ["reading","painting","playing guitar"],"isStudent": "true","name": "John Doe","phoneNumbers": [{"number": "888-1234","type": "home"},{"number": "888-5678","type": "work"}]
}
1.1、判断.json文件工具
JSON转C#实体类网站,可判断JSON文件是否正确:https://www.bejson.com/convert/json2csharp/
2、生成.json数据
根据以上json内存,创建一个文件夹,将其写入.json文件夹,保存在项目下,运行代码如下所示:
//包含的头文件
#include <QMainWindow>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QString>
#include <QFile>//创建一个json文件,写入参数,并保存在对应的路径下
void MainWindow::WriteToFile()
{QString m_path = QString::fromStdString(QCoreApplication::applicationDirPath().toStdString()+"//cfg.json");createJsonFile(m_path);
}
void MainWindow::createJsonFile(const QString &filePath)
{//创建一个JSON对象QJsonObject jsonObj;//插入name 键值对到 jsonObjjsonObj["name"]="John Doe";//jsonObj.insert("name","John Doe");//插入age 键值对到 jsonObjjsonObj["age"]="31";//jsonObj.insert("age","31");//创建地址JSON对象,里面包含两个键值对QJsonObject addressObj;//插入city 键值到 “New York”addressObj.insert("city","WuHan");addressObj.insert("street","luck");jsonObj.insert("address",addressObj);//创建地址JSON对象,里面包含两个键值对QJsonArray phoneArray;//创建两个电话的JSON对象QJsonObject phoneHomeObj;phoneHomeObj.insert("type","home");phoneHomeObj.insert("number","888-1234");QJsonObject phoneWorkObj;phoneWorkObj.insert("type","work");phoneWorkObj.insert("number","888-5678");//将电话JSON数组中添加两个电话JSON对象phoneArray.append(phoneHomeObj);phoneArray.append(phoneWorkObj);//将电话JSON数组中添加两个电话JSON对象jsonObj.insert("phoneNumbers",phoneArray);//创建地址JSON对象,里面包含了三组数组QJsonArray hobbArray;hobbArray.append("reading");hobbArray.append("painting");hobbArray.append("playing guitar");jsonObj.insert("hobbies",hobbArray);jsonObj["isStudent"]="true";//创建一个JSON文档QJsonDocument jsonDoc(jsonObj);//将JSON文档内容写入文件QFile file(filePath);if(!file.open(QIODevice::WriteOnly)){//处理错误,例如可以抛出异常或者返回错误的标志return;}file.write(jsonDoc.toJson());file.close();
}
3、解析.json数据
创建一个cfg.json文件,将其内容粘贴负责其内;
{"name": "小王","age": 30,"address": {"city": "北京","street": "人民路32号"},"phoneNumbers": [{"number": "999-123456","type": "家"},{"number": "999-654321","type": "公司"}]
}
使用QT解析以上json内容:
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <QDebug>
#include <QFile>QByteArray MainWindow::ReadJsonString(QString file_path)
{QFile file(file_path); //根据路径打卡文件if (false == file.exists()) //判断文件是否存在{return "none";}if (false == file.open(QIODevice::ReadOnly | QIODevice::Text)) //判断文件是否可以正常以只读模式打开{return "none";}QByteArray string_value = file.readAll(); //读出.json所以内容file.close();return string_value;
}void MainWindow::AnalyJson()
{
//json文件所在路径,可根据自己随意定制QString path= QString::fromStdString(QCoreApplication::applicationDirPath().toStdString()+"//cfg.json");QByteArray reg_fpga = ReadJsonString(path);// 字符串格式化为JSON文档QJsonParseError err_rpt;QJsonDocument reg_fpga_root = QJsonDocument::fromJson(reg_fpga, &err_rpt);if (err_rpt.error != QJsonParseError::NoError){// 不是 JSON 对象:JSON 字符串格式错误或无效std::cout << "json 格式错误" << std::endl;// return 0;}//将 QJsonDocument 对象中的 JSON 数据转换为 JSON 对象QJsonObject reg_object = reg_fpga_root.object();// 获取 JSON 数据中的所有键QStringList keys = reg_object.keys();// 遍历键值对for (int i = 0;i<keys.size();++i) {// 获取每一个 keyQString key = keys[i];// 通过 key 获取对应的 valueQJsonValue value = obj.value(key);if(value.isBool()){// 值是一个 boolqDebug()<<key<<":"<<value.toBool();}else if(value.isString()){// 值是一个字符串qDebug()<<key<<":"<<value.toString();}else if(value.isDouble()){// 值是一个 double 或者 int(double 和 int 都用 isDouble)qDebug()<<key<<":"<<value.toInt();}else if(value.isObject()){// 值是一个 JSON 对象qDebug()<<key<<":";// 这里偷个懒,不再像上面那样循环获取值了,而是直接通过已知的键去获取值QJsonObject addressObj = value.toObject();QString city = addressObj["city"].toString();QString street = addressObj["street"].toString();qDebug()<<" "<<"city:"<<city;qDebug()<<" "<<"street:"<<street;}else if (value.isArray()){// 值是一个 JSON 数组qDebug()<<key<<":";QJsonArray phoneArray = value.toArray();for (int i = 0;i<phoneArray.size();++i) {// 遍历 JSON 数组中的每一个 JSON 对象QJsonObject phoneObj = phoneArray[i].toObject();QString number = phoneObj["number"].toString();QString type = phoneObj["type"].toString();qDebug()<<" "<<"number:"<<number;qDebug()<<" "<<"type:"<<type;}}}
}
相关文章:
QT笔记---JSON
QT笔记---JSON JSON1、JSON基本概念1.1、判断.json文件工具 2、生成.json数据3、解析.json数据 JSON 在现代软件开发中,数据的交换和存储格式至关重要。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,以其简洁易…...
C++ string的模拟实现
Hello!!大家早上中午晚上好,昨天复习了string的使用,今天来模拟实现一下string!!! 一、string的框架搭建 1.1首先我们需要一个string的头文件用来做变量、函数、类等声明;再需要一个test文件来做测试,还需…...
使用LangChain实现基于LLM和RAG的PDF问答系统
目录 前言一.大语言模型(LLM)1. 什么是LLM?2. LLM 的能力与特点 二、增强检索生成(RAG)三. 什么是 LangChain?1. LangChain 的核心功能2. LangChain 的优势3. LangChain 的应用场景4. 总结 四.使用 LangChain 实现基于 PDF 的问答系统 前言 本文将介绍 …...
图像滤波中常用滤波器的相位响应——不是只有零相位滤波器
实偶函数滤波器 当滤波器是实偶函数时,其滤波结果的相位在通带内为 0 或 π \pi π,正频率和负频率成分的相位相同。这种相位特性使得实偶函数滤波器在低通滤波、平滑处理等需要保持信号相位不失真的应用中非常有用。 实偶函数特性: 滤波器…...
学习CSS滤镜属性 `filter: invert()`
一、核心机制 数学原理 invert(1) 对每个像素的RGB通道执行 颜色反相计算: 新通道值 255 - 原通道值 例如 rgb(255,0,0)(纯红)会转换为 rgb(0,255,255)(青色)。 透明度处理 该滤镜会保留元素的Alpha通道(…...
C++实现rabbitmq生产者消费者
RabbitMQ是一个开源的消息队列系统,它实现了高级消息队列协议(AMQP), 特点 可靠性:通过持久化、镜像队列等机制保证消息不丢失,确保消息可靠传递。灵活的路由:提供多种路由方式,如…...
在VMware上部署【Ubuntu】
镜像下载 国内各镜像站点均可下载Ubuntu镜像,下面例举清华网站 清华镜像站点:清华大学开源软件镜像站 | Tsinghua Open Source Mirror 具体下载步骤如下: 创建虚拟机 准备:在其他空间大的盘中创建存储虚拟机的目录,…...
【Pandas】pandas Series plot.barh
Pandas2.2 Series Plotting 方法描述Series.plot([kind, ax, figsize, …])用于绘制 Series 对象的数据可视化图表Series.plot.area([x, y, stacked])用于绘制堆叠面积图(Stacked Area Plot)Series.plot.bar([x, y])用于绘制垂直条形图(Ver…...
检索增强生成(2)本地PDF 本地嵌入模型
from langchain_community.document_loaders import PyPDFLoader from pathlib import Pathdef load_local_pdf(file_path):if not Path(file_path).exists():raise FileNotFoundError(f"文件 {file_path} 不存在!")loader PyPDFLoader(file_path)try:do…...
又双叒叕Scrapy爬虫相关的面试题及详细解答
Scrapy是Python开发的一个快速、高层次的网络爬虫框架,专注于高效抓取网页并提取结构化数据。其核心设计基于异步处理机制,适合大规模数据采集任务。 文章目录 基础概念1. Scrapy框架的核心组件有哪些?架构与流程2. 描述Scrapy的工作流程核心组件详解3. 如何自定义Item Pipe…...
【QA】装饰模式在Qt中有哪些运用?
在Qt框架中,装饰模式(Decorator Pattern)主要通过继承或组合的方式实现,常见于IO设备扩展和图形渲染增强场景。以下是Qt原生实现的装饰模式典型案例: 一、QIODevice装饰体系(继承方式) 场景 …...
【保姆级】阿里云codeup配置Git的CI/CD步骤
以下是通过阿里云CodeUp的Git仓库进行CI/CD配置的详细步骤,涵盖前端(Vue 3)和后端(Spring Boot)项目的自动化打包,并将前端打包结果嵌入到Nginx的Docker镜像中,以及将后端打包的JAR文件拷贝至Do…...
使用STM32CubeMX+DMA+空闲中断实现串口接收和发送数据(STM32G070CBT6)
1.STM32CubeMX配置 (1)配置SYS (2)配置RCC (3)配置串口,此处我用的是串口4,其他串口也是一样的 (4)配置DMA,将串口4的TX和RX添加到DMA中 &#…...
【视觉提示学习】3.21论文随想
. . Frontiers of Information Technology & Electronic Engineering. 2024, 25(1): 42-63 https://doi.org/10.1631/FITEE.2300389 中文综述,根据里面的架构,把视觉提示学习分成两类,一类是单模态提示学习(以vit为代表&…...
(一)丶Windows安装RabbitMQ可能会遇到的问题
一丶可能会忘了配置ERLang的环境变量 二丶执行命令时报错 第一步 rabbitmq-plugins enable rabbitmq_management 第二部 rabbitmqctl status 三丶修改.erlang.cookie 文件 1.找到C盘目下的.erlang.cookie文件 C:\Users\admin\.erlang.cookie C:\Windows\System32\config\sys…...
Mistral AI发布开源多模态模型Mistral Small 3.1:240亿参数实现超越GPT-4o Mini的性能
法国人工智能初创公司Mistral AI于2025年3月正式推出新一代开源模型Mistral Small 3.1 ,该模型凭借240亿参数的轻量级设计,在多项基准测试中表现优异,甚至超越了Google的Gemma 3和OpenAI的GPT-4o Mini等主流专有模型。 1、核心特性与优势 多…...
如何在IPhone 16Pro上运行python文件?
在 iPhone 16 Pro 上运行 Python 文件需要借助第三方工具或远程服务,以下是具体实现方法和步骤: 一、本地运行方案(无需越狱) 使用 Python 编程类 App 以下应用可在 App Store 下载,支持直接在 iPhone 上编写并运行 …...
springboot整合mybatis-plus【详细版】
目录 一,简介 1. 什么是mybatis-plus2.mybatis-plus特点 二,搭建基本环境 1. 导入基本依赖:2. 编写配置文件3. 创建实体类4. 编写controller层5. 编写service接口6. 编写service层7. 编写mapper层 三,基本知识介绍 1. 基本注解 T…...
视频剪辑行业的现状与进阶之路:一个双视角分析
视频剪辑行业的现状与进阶之路:一个双视角分析 一、现状解析 商业角度分析 成本控制 培训需要投入时间和人力成本 快节奏的市场环境要求快速产出 人员流动性大,培训投入可能无法获得长期回报 市场需求 大量内容需要快速产出 标准化的剪辑模板更容易管理 …...
k近邻图(knn-graph)和局部线性嵌入图(LLE-graph)的相似性和区别
K 近邻图(KNN - graph)和局部线性嵌入图(LLE - graph)是用于构建数据点之间关系图的两种方法。 1. k近邻图(knn-graph) 核心思想:k近邻图通过计算样本之间的距离来构建图。具体来说,…...
Qt之MVC架构MVD
什么是MVC架构: MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controll…...
使用 Apktool 反编译、修改和重新打包 APK
使用 Apktool 反编译、修改和重新打包 APK 在 Android 逆向工程和应用修改过程中,apktool 是一个强大的工具,它允许我们解包 APK 文件、修改资源文件或代码,并重新打包成可安装的 APK 文件。本文将介绍如何使用 apktool 进行 APK 反编译、修…...
深度解析学术论文成果评估(Artifact Evaluation):从历史到现状
深度解析学术论文成果评估(Artifact Evaluation):从历史到现状 引言 在计算机科学和工程领域的学术研究中,可重复性和可验证性越来越受到重视。随着实验性研究的复杂性不断增加,确保研究成果可以被其他研究者验证和构建变得尤为重要。这一需…...
二分查找上下界问题的思考
背景 最近在做力扣hot100中的二分查找题目时,发现很多题目都用到了二分查找的变种问题,即二分查找上下界问题,例如以下题目: 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查找元素的第一个和最后一个位置 它们不同于查找…...
关于FastAPI框架的面试题及答案解析
FastAPl是一个现代、快速(高性能)的Web框架,用于构建API,基于Python3.7+的类型提示功能。它由Python开发者SebastianRamirez创建,并且使用了Starlette作为其核心组件以及Pydantic进行数据验证。 文章目录 基础篇1. FastAPI的核心优势是什么?2. 如何定义一个GET请求路由?…...
Ubuntu检查并启用 Nginx 的stream模块或重新安装支持stream模块的Nginx
stream 模块允许 Nginx 处理 TCP 和 UDP 流量,常用于负载均衡和端口转发等场景。本文将详细介绍如何检查 Nginx 是否支持 stream 模块,以及在需要时如何启用该模块。 1. 检查 Nginx 是否支持 stream 模块 首先,需要确认当前安装的 Nginx 是…...
HashMap添加元素的流程图
文章目录 JDK7 vs JDK8 的 HashMap 结构变化Java8 中哈希表的红黑树优化机制HashMap 添加元素的完整流程解析1. 计算 key 的哈希值并确定索引2. 检查该索引位置是否已有元素3. 处理哈希冲突4. 判断当前存储结构(链表还是红黑树)5. 判断链表长度是否超过 …...
(八)Set 的使用
Set 的使用 Set 的特点 主要功能:去除重复内容。特性:无序且不支持重复的集合,不能通过索引访问元素。 示例代码 void main() {// 创建一个包含重复元素的列表List<String> fruits [香蕉, 苹果, 西瓜, 香蕉, 苹果, 香蕉, 苹果];//…...
Spring Boot 集成 Kafka 消息发送方案
一、引言 在 Spring Boot 项目中,Kafka 是常用的消息队列,可实现高效的消息传递。本文介绍三种在 Spring Boot 中使用 Kafka 发送消息的方式,分析各自优缺点,并给出对应的 pom.xml 依赖。 二、依赖引入 在 pom.xml 中添加以下依赖: <dependencies><!-- Sprin…...
面向医药仓储场景下的药品分拣控制策略方法 研究(大纲)
面向医药仓储场景下的药品分拣控制策略方法研究 基于多机器人协同与智能调度的分拣系统设计 第一章 绪论 1.1 研究背景与意义 医药仓储自动化需求: 人工分拣效率低、出错率高(如药品批次混淆、过期风险)温控药品(如疫苗、生物制…...
