当前位置: 首页 > news >正文

读取和写入json,xml文件

一、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://chechia.hdqtgc.cn
http://blackface.hdqtgc.cn
http://asp.hdqtgc.cn
http://affectional.hdqtgc.cn
http://alphonse.hdqtgc.cn
http://chemolysis.hdqtgc.cn
http://banderole.hdqtgc.cn
http://athodyd.hdqtgc.cn
http://chronology.hdqtgc.cn
http://abuse.hdqtgc.cn
http://breadless.hdqtgc.cn
http://bemaul.hdqtgc.cn
http://calces.hdqtgc.cn
http://archidiaconate.hdqtgc.cn
http://bluebonnet.hdqtgc.cn
http://boloney.hdqtgc.cn
http://chaplet.hdqtgc.cn
http://capricornus.hdqtgc.cn
http://antirheumatic.hdqtgc.cn
http://carbine.hdqtgc.cn
http://appressorium.hdqtgc.cn
http://carious.hdqtgc.cn
http://apologise.hdqtgc.cn
http://aiee.hdqtgc.cn
http://barrelled.hdqtgc.cn
http://bassoon.hdqtgc.cn
http://animatingly.hdqtgc.cn
http://athenian.hdqtgc.cn
http://apograph.hdqtgc.cn
http://bringdown.hdqtgc.cn
http://www.dtcms.com/a/280926.html

相关文章:

  • Kubernetes 架构原理与集群环境部署
  • Codeforces Round 907 (Div. 2) F. A Growing Tree(2000,子树修改)
  • 拥抱 Spring Boot:开启 Java 后端开发的“快车道”
  • MySQL功能模块探秘:数据库世界的奇妙之旅
  • 解决了困扰我的upload靶场无法解析phtml等后缀的问题
  • JAVA学习笔记 使用notepad++开发JAVA-003
  • SpringBoot 3.x集成阿里云OSS:文件上传 断点续传 权限控制
  • 填补空白!openKylin率先完成RISC-V商业打印驱动全适配
  • AI问答-Token:在人工智能领域,Token 是模型处理文本的核心单元 / 最小可处理片段
  • Python打卡训练营Day58
  • 大白话解释一下RTC实时时钟
  • 【机器学习深度学习】大模型推理速度与私有化部署的价值分析
  • 元宇宙内容生产工具终局之战:三维编辑、实时协同与跨平台发布的黄金三角
  • 2025年夏Datawhale AI夏令营机器学习
  • Springboot 项目 连接人大金仓数据库,进行功能查询demo示例
  • pytorch学习笔记(四)-- TorchVision 物体检测微调教程
  • 图像修复:深度学习实现老照片划痕修复+老照片上色
  • 一文读懂循环神经网络—门控循环单元
  • 深度学习 Pytorch图像分类步骤
  • 僵尸进程Zombie Process
  • 如何通过 WebSocket 接口订阅实时外汇行情数据(PHP 示例)
  • dom节点操作方法与事件冒泡总结
  • Python爬虫实战:研究Mistune库相关技术
  • Android中Launcher简介
  • 【SOA用于噪声抑制】光纤DFB激光器中弛豫振荡噪声抑制
  • Android原生Dialog
  • 关于我用AI编写了一个聊天机器人……(番外1)
  • 博客项目 laravel vue mysql 第六章 文章功能
  • PHP:从入门到实战的全面指南
  • 【PTA数据结构 | C语言版】构造二叉树