一、JSON文件操作​

1. 核心类​​

​​QJsonDocument​​:表示整个JSON文档,提供解析(fromJson())和序列化(toJson())功能。
​​QJsonObject​​:存储键值对集合,支持嵌套对象和数组。
​​QJsonArray​​:存储有序值列表。
​​QJsonValue​​:封装JSON支持的数据类型(字符串、数字、布尔值等)

2. 读写操作​

读取JSON文件​​:

QFile file("config.json");
if (!file.open(QIODevice::ReadOnly)) 
{return; // 错误处理
}
// 读取文件
QByteArray jsonStr = file.readAll();
// 关闭文件
file.close();// 将json字符串转化为json文档
QJsonDocument jsonDoc = QJsonDocument::format(jsonStr);// 将json文档转化为json对象
QJsonObject jsonObj = jsonDoc.object();// 获取对应的数据,获取的类型默认值为QJsonValue
jsonObj.value("键").to对应的类型转化;

写入JSON文件​​:

// 创建json对象
QJsonObject rootObj;
// 插入内容
rootObj.insert("key","value");// 将json对象转化为json文档
QJsonDocument jsonDoc(jsonObj);
// 将json文档转化为json字符串
QByteArray jsonStr = jsonDoc.toJson(QJsonDocument::Compact);
// 打开文件
QFile file("相对路径/绝对路径");
if(!file.open(QIODevide::WriteOnly))
{return;// 错误处理
}
// 写入json字符串
file.write(jsonStr);
// 关闭文件
file.close();

二、XML文件操作​

1. 两种处理方式对比​

​​方法适用场景​​​核心类​
DOM模型 ​​小文件、需随机访问或修改QDomDocument, QDomNode
​​ 流式处理​​大文件、只需顺序读写QXmlStreamReader/Writer

2. DOM模型示例

读取XML​​:

// 1、载入xml文档
QDomDocument doc;QFile file("相对路径/绝对路径");if(!file.open(QIODevice::ReadOnly))
{qDebug() << "文件打开失败";return;
}QString errorMsg;
int errorLine, errorColumn;
if(!doc.setContent(&file, &errorMsg, &errorLine, &errorColumn))
{qDebug() << "XML解析错误:" << errorMsg << "at line" << errorLine << "column" << errorColumn;file.close();return;
}qDebug() << "文件读取成功";
file.close();// 2、读取头部信息
QDomNode head = doc.firstChild();
qDebug() << head.nodeName() << head.nodeType() << head.nodeValue();// 3、获取根节点
QDomElement rootEle = doc.documentElement();
qDebug() << rootEle.nodeName() << rootEle.nodeType() << rootEle.nodeValue() << rootEle.tagName();// 4、获取name标签
QDomElement nameEle = rootEle.firstChild().toElement();
qDebug() << nameEle.nodeName() << nameEle.nodeType() << nameEle.nodeValue();
qDebug() << nameEle.tagName() << nameEle.text() << nameEle.attribute("id") << nameEle.attribute("height");// 循环son获取数据
QDomElement sonEle = nameEle.nextSiblingElement("son");
QDomNode node = sonEle.firstChild();while (node.isElement()) 
{QDomElement temp = node.toElement();qDebug() << temp.text();node = temp.nextSiblingElement();
}

读取XML表格:

QDomDocument doc;QFile file("相对路径/绝对路径");
if(!file.open(QIODevice::ReadOnly))
{qDebug() << "文件打开失败";return;
}
qDebug() << doc.setContent(&file);//通过 elementsByTagName 来获取标签对象
QDomNodeList namels = doc.elementsByTagName("book-name");
QDomNodeList authorls = doc.elementsByTagName("author");
QDomNodeList pricels = doc.elementsByTagName("price");
QDomNodeList pubdatels = doc.elementsByTagName("publish-date");
// 设置表格大小
ui->tableWidget->setRowCount(namels.size());
ui->tableWidget->setColumnCount(4);
ui->tableWidget->setHorizontalHeaderLabels({"书名","作者","价格","出版日期"});// 因为 nameList、authorList等链表的长度是一样的,所以使用一个循环即可
for(int i = 0;i < namels.size();i++)
{QDomElement nameEle = namels.at(i).toElement();qDebug() << nameEle.tagName() << nameEle.text();QDomElement authorEle = authorls.at(i).toElement();QDomElement priceEle = pricels.at(i).toElement();QDomElement pubdateEle = pubdatels.at(i).toElement();//ui->tableWidget->setItem(i,0,new QTableWidgetItem(nameEle.nextSiblingElement().text()));ui->tableWidget->setItem(i,0,new QTableWidgetItem(nameEle.text()));ui->tableWidget->setItem(i,1,new QTableWidgetItem(authorEle.text()));ui->tableWidget->setItem(i,2,new QTableWidgetItem(priceEle.text()));ui->tableWidget->setItem(i,3,new QTableWidgetItem(pubdateEle.text()));
}file.close();

写入XML​​:

// 1、在内存当中创建doc树
// 1.1、创建一个空的dom树
QDomDocument doc;// 1.2、创建头部标签
QDomProcessingInstruction head = doc.createProcessingInstruction("xml","version='1.0' encoding='utf-8'");
// 追加给dom树
doc.appendChild(head);// 1.3、添加跟标签
QDomElement rootEle = doc.createElement("root");
// 追加给dom树
doc.appendChild(rootEle);// 1.4、向根标签中添加子标签
QDomElement userEle = doc.createElement("user");
rootEle.appendChild(userEle);// 向子标签添加属性
userEle.setAttribute("id","0101");
QDomText textEle = doc.createTextNode("张无忌");
userEle.appendChild(textEle);// 2、将doc树写入文件
QFile file("相对路径/绝对路径");
if(!file.open(QIODevice::WriteOnly))
{qDebug() << "文件打开失败";return;
}
QTextStream out(&file);
doc.save(out,4);
file.close();

3. 流式处理示例​

读取XML​​:

// 载入xml文档,并将节点都保存为“记号”
QFile file("相对路径/绝对路径");
if(!file.open(QIODevice::ReadOnly))
{qDebug() << "文件打开失败";return;
}QXmlStreamReader reader;
reader.setDevice(&file);// 循环获得标记
while(!reader.atEnd())
{// 找到下一个记号,并保存该记号的类型QXmlStreamReader::TokenType type = reader.readNext();if(type == QXmlStreamReader::StartDocument){qDebug() << reader.documentVersion() << reader.documentEncoding();}else if(type == QXmlStreamReader::StartElement){if(reader.attributes().hasAttribute("id")){QString id = reader.attributes().value("id").toString();qDebug() << QString("<%1 id=\"%2\">").arg(reader.name()).arg(id);}else {qDebug() << QString("<%1>").arg(reader.name());}}else if(type == QXmlStreamReader::EndElement){qDebug() << QString("</%1>").arg(reader.name());}else if(type == QXmlStreamReader::Characters && !reader.isWhitespace()){qDebug() << reader.text();}
}file.close();

写入XML​​:

// 1、使用写入流绑定一个xml文件(目的就是向文件中写入内容)
QFile file("相对路径/绝对路径");
if(!file.open(QIODevice::WriteOnly))
{qDebug() << "文件打开失败";return;
}QXmlStreamWriter writer(&file);// 2、向xml中写入内容
// 实现自动格式化文档
writer.setAutoFormatting(true);// 创建头
// <?xml version="1.0" encoding="utf-8"?>
writer.writeStartDocument();// 创建第一个元素
// <user>
writer.writeStartElement("user");
// <name id="1001" height="175.8">于谦</name>
writer.writeStartElement("name");
writer.writeAttribute("id","1001");
writer.writeAttribute("height","175.8");
writer.writeCharacters("于谦");
writer.writeEndElement();// <isMarry>true</isMarry>
writer.writeTextElement("isMarray","true");// </user>
writer.writeEndElement();// 关闭文档
writer.writeEndDocument();
// 3、关闭文件
file.close();

三、总结

  1. ​​配置文件存储​​:
    JSON:适合结构简单、需频繁读写的配置(如用户设置)。
    XML:适合复杂结构或需验证的场景(如SOAP通信、文档格式)。

  2. ​​路径管理​​:
    外部文件路径用QCoreApplication::applicationDirPath()获取。

  3. ​​版本兼容​​:
    Qt 6移除了QJsonDocument::fromBinaryData(),优先使用文本格式

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习×第10卷:她用一块小滤镜,在图像中找到你

&#x1f308;【第一节 她看到的是像素点&#xff0c;却试图拼出你整张脸】&#x1f4f8; 图像是什么&#xff1f;她从未见过你&#xff0c;但看见的是你的一片光斑图像&#xff0c;在神经网络的眼里&#xff0c;是一个个数字格子。这些格子&#xff0c;每个都有 0~255 的亮度…

计算机组成原理中的RAM:核心技术深度解析

摘要&#xff1a;本文深度剖析RAM在计算机体系中的核心地位&#xff0c;结合2025年最新技术标准与实测数据&#xff0c;涵盖DRAM工作原理、主流技术对比、非易失性存储革新及未来发展趋势&#xff0c;为硬件开发者和系统架构师提供权威技术参考。一、RAM基础原理与系统交互机制…

C语言—深入理解指针(详)

深入理解指针&#xff08;详解&#xff09;前言一、指针是什么1、指针的定义2、指针的大小二、指针类型1、类型2、不同类型的意义三、野指针1、野指针形成原因2、如何避免野指针四、指针的运算1、 指针整数2、指针-指针3、指针的关系运算五、const修饰指针1、consr修饰变量2、c…

小谈相机的学习过程

前言博主本人并非专职相机开发&#xff0c;还涉及系统的其他几个模块&#xff0c;虽然都属于owner&#xff0c;但是都还在学习探索的一个过程&#xff0c;自认为掌握还不够细致&#xff0c;此篇文章仅梳理&#xff0c;总结&#xff0c;印证自己近五年相机模块的一个学习过程&am…

CentOS7 内网服务器yum修改

1、首先确定的内网服务器是有yum源代理服务器的2、修改 /etc/yum.conf 配置文件&#xff0c;增加代理ip和端口号proxyhttp://ip.ip.ip.ip:port3、备份源是文件sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak4、修改配置文件 vi CentOS-Base…

基于单片机自行车自动防盗报警系统设计

摘 要 本文阐述了自行车防盗报警系统原理&#xff0c;介绍如何用stc89c52单片机实现防盗报警&#xff0c;分析各个部分的工作原理&#xff0c;并给出了原理图和源程序。此设计电路由震动传感器、单片机、无线超再生发射/接收电路、LED显示器和蜂鸣器组成。由于超再生接收是一种…

【深度学习】神经网络反向传播算法-part4

七、反向传播算法反向传播Back Propagation 简称 BP 。 训练神经网络的核心算法之一&#xff0c;通过计算损失函数&#xff0c;相对于每个权重参数的梯度&#xff0c;来优化神经网络的权重1. 前向传播前向传播是把数据经过各层神经元的运算并逐层向前传输&#xff0c;知道输出层…

CTF之服务器端模板注入(SSTI)与赛题

概念定义服务器端模板注入(Server-Side Template Injection)服务端接受攻击者的输入&#xff0c;将其作为Web应用内容的一部分&#xff0c;在进行代码编译渲染的过程中&#xff0c;进行了语句的拼接&#xff0c;执行了所插入的恶意内容&#xff0c;从而导致信息泄露、代码执行、…

除了某信,就是这款软件来替代了!

引言 哈喽&#xff0c;我是小索奇。有时候会有一个普遍的需求&#xff0c;想在几个设备之间传个文件或者发个消息&#xff0c;除了微信&#xff0c;想一想你还能用什么软件&#xff1f; 今天就是为了解决这个问题&#xff0c;给大家介绍一款软件 Localsend 来解决。 内容模块…

Vue2.x封装预览PDF组件

一、为什么用PDFObject插件&#xff1f; PDFObject 是一个轻量级的 JavaScript 库&#xff0c;主要用于在网页中嵌入和预览 PDF 文件。它通过简单的 API 调用&#xff0c;可以在浏览器中实现 PDF 文件的显示&#xff0c;而无需依赖任何插件。以下将详细介绍 PDFObject 的特点、…

undefined reference to ‘end‘

相关问题&#xff1a; 一、undefined reference to _exit undefined reference to ‘end‘ warning: _close is not implemented and will always fail 一、环境&#xff1a; ubuntu24.04实体机、 arm-none-eabi-gcc gcc version 13.2.1 20231009 (15:13.2.rel1-2) 二…

nginx定制http头信息

修改http响应头信息&#xff0c;相关Nginx模块&#xff1a;ngx_http_headers_moduleexpires语法&#xff1a;expires [modified] time;expires [modified] time;默认值&#xff1a;expires off;作用域&#xff1a;http, server, location, if in location用途&#xff1a;控制缓…

主机安全---开源wazuh安装

Wazuh 简介 Wazuh 是一款免费开源的终端安全监控平台&#xff0c;支持威胁检测、完整性监控、事件响应和合规性管理&#xff0c;适用于企业级安全运维场景。其核心组件包括&#xff1a; Wazuh Indexer&#xff1a;基于 OpenSearch 的日志存储与检索组件。Wazuh Server&#x…

GaussDB 数据库架构师修炼(四) 备份容量估算

1 影响备份容量关键要素业务总数据量备份数据保留周期备份周期备份数据的压缩比平均每天的新增数据量平均每天新增日志数据量2 备份容量的估算方法公式备份容量C &#xff1d; 自动全量备份容量C1 &#xff0b; 自动差量备份容量C2 &#xff0b; 自动日志归档 容量C3 &#xff…

《R for Data Science (2e)》免费中文翻译 (第0章) --- Introduction

写在前面 本系列推文为《R for Data Science (2e)》的中文翻译版本。所有内容都通过开源免费的方式上传至Github&#xff0c;欢迎大家参与贡献&#xff0c;详细信息见&#xff1a; Books-zh-cn 项目介绍&#xff1a; Books-zh-cn&#xff1a;开源免费的中文书籍社区 r4ds-zh-cn…

如何 ASP.NET Core 中使用 WebSocket

如何在 ASP.NET Core 中使用 WebSocket在现代 Web 应用程序中&#xff0c;WebSocket 连接非常流行且使用率极高。它可以帮助企业满足数字环境需求&#xff0c;并处理来自最终用户的实时数据。它还能提升生产力、输出率和用户体验。如果您还没有使用 WebSocket&#xff0c;那么您…

Python之--元组

定义是 Python 中内置的不可变序列。在 Python 中使用&#xff08;&#xff09;定义元组&#xff0c;元素与元素之间使用英文的逗号分隔。元组中只有一个元素的时候&#xff0c;逗号也不能省略。元组的创建方式&#xff08;1&#xff09;使用&#xff08;&#xff09;直接创建元…

工业相机GigE数据接口的优势及应用

工业相机不同的数据接口适用的应用场景也不同&#xff0c;选择合适的数据额接口&#xff0c;可大大提高效率。今天我们来看看常见的GigE接口的优势及应用。基于GigE Vision标准的千兆以太网&#xff08;GigE&#xff09;相机通过提供快速、灵活且成本效益高的成像解决方案&…

【53】MFC入门到精通——MFC串口助手(二)---通信版(发送数据 、发送文件、数据转换、清空发送区、打开/关闭文件),附源码

文章目录1 完整 功能展示2 添加控件变量及声明2.1 添加控件及变量2.2 SerialPortDlg.h: 头文件3 函数实现3.1 数据发送3.1.2 写数据、字符串转3.2 发送文件3.2.1 打开文件3.2.2 发送文件3.3 清空发送区4 完整MFC项目项下载1 完整 功能展示 串口通信助手 页面展示&#xff0c;功…

算法学习笔记:27.堆排序(生日限定版)——从原理到实战,涵盖 LeetCode 与考研 408 例题

堆排序&#xff08;Heap Sort&#xff09;是一种基于二叉堆数据结构的高效排序算法&#xff0c;由计算机科学家 J. W. J. Williams 于 1964 年提出。它结合了选择排序的思想和二叉堆的特性&#xff0c;具有时间复杂度稳定&#xff08;O (nlogn)&#xff09;、原地排序&#xff…