使用 Qt 处理 JSON 数据:从入门到精通

embedded/2025/4/1 4:52:20/

目录

什么是 JSON?

使用 Qt 处理 JSON 数据

生成 JSON 数据

示例代码

代码解释

解析 JSON 数据

示例代码

代码解释

总结

        随着现代应用程序对数据交换需求的不断增加,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,变得越来越重要。Qt 框架提供了强大的工具来处理 JSON 数据,使得开发者能够轻松地将 JSON 集成到他们的项目中。

什么是 JSON?

        JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也适合机器解析和生成。它基于 JavaScript 对象语法,并且独立于语言,几乎在所有现代编程语言中都有实现。

JSON 的主要特点包括:

  • 易读性和简洁性。

  • 支持复杂的结构,如对象、数组、字符串、数字、布尔值等。

  • 轻量级,解析速度快。

使用 Qt 处理 JSON 数据

        Qt 框架提供了一个强大的 JSON 处理库 QJson,位于 QtCore 模块中。这个库允许开发者轻松地创建、解析和操作 JSON 数据。以下是使用 Qt 处理 JSON 数据的主要步骤:

  1. 生成 JSON 数据:将应用程序中的数据结构转换为 JSON 格式。

  2. 解析 JSON 数据:从 JSON 字符串或文件中提取数据,并将其转换为应用程序可以使用的格式。

生成 JSON 数据

        在 Qt 中,JSON 数据可以通过 QJsonDocument 类来表示。QJsonDocument 是一个高层次的类,用于处理整个 JSON 文档。你可以使用它来创建、验证和序列化 JSON 数据。

以下是常用的 JSON 元素:

  • 对象(Object):键值对的集合。

  • 数组(Array):一组有序的值。

  • 字符串(String):文本数据。

  • 数字(Number):整数或浮点数。

  • 布尔值(Boolean)true 或 false

  • null 值:表示无有效值。

示例代码

下面是一个生成 JSON 数据的示例:

#include <QtCore/QCoreApplication>
#include <QtCore/QJsonDocument>
#include <QtCore/QJsonObject>
#include <QtCore/QJsonArray>
#include <QtCore/QFile>int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);// 创建一个 JSON 对象(Object)QJsonObject obj;obj["name"] = "John Doe";obj["age"] = 30;obj["isStudent"] = false;// 将对象添加到数组中QJsonArray arr;arr.append("Hello, World!");arr.append(123);arr.append(true);obj["message"] = arr;// 创建一个 JSON 文档QJsonDocument doc;doc.setObject(obj);// 将文档保存到文件if (QFile::exists("output.json")) {QFile::remove("output.json");}if (QFile::writeFile("output.json", doc.toJson())) {qDebug() << "JSON 文件已成功生成:output.json";} else {qDebug() << "无法写入文件";}return app.exec();
}

代码解释

1.包含必要的头文件:

  • QJsonDocument 和 QJsonObject 用于处理 JSON 数据。

  • QFile 用于文件操作。

2.创建一个 JSON 对象

QJsonObject obj;
obj["name"] = "John Doe";

上述代码创建了一个包含键值对的 JSON 对象。

3.创建一个 JSON 对象

QJsonArray arr;
arr.append("Hello, World!");
arr.append(123);
arr.append(true);obj["message"] = arr;

 可以将数组作为值添加到对象中,从而实现嵌套结构。

4.创建 JSON 文档

QJsonDocument doc;
doc.setObject(obj);

QJsonDocument 是 Qt 中处理 JSON 数据的核心类。它允许你将 JSON 对象或数组序列化为 JSON 格式的字符串,或者从文件中反序列化为对象/数组。

5.将文档写入文件

if (QFile::writeFile("output.json", doc.toJson())) {qDebug() << "JSON 文件已成功生成:output.json";
} else {qDebug() << "无法写入文件";
}

使用 doc.toJson() 方法可以将 JSON 文档转换为字符串,并将其保存到文件中。

解析 JSON 数据

        解析 JSON 数据的过程与生成过程类似。我们需要从文件或字符串中加载 JSON 数据,并将其转换为我们可以使用的 Qt 对象(如 QJsonObject 或 QJsonArray)。

示例代码

下面是一个解析 JSON 数据的示例:

#include <QtCore/QCoreApplication>
#include <QtCore/QJsonDocument>
#include <QtCore/QJsonObject>
#include <QtCore/QJsonArray>
#include <QtCore/QFile>int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);// 从文件中加载 JSON 数据QFile file("output.json");if (!file.open(QIODevice::ReadOnly)) {qDebug() << "无法打开文件";return -1;}QByteArray data = file.readAll();file.close();// 创建一个 JSON 文档QJsonDocument doc;doc.fromJson(data, doc);// 获取根对象const QJsonObject& rootObject = doc.object();// 遍历对象并输出数据qDebug() << "JSON 对象内容:";for (const QString& key : rootObject.keys()) {const QVariant& value = rootObject[key];qDebug() << key << ":" << value;}return app.exec();
}

代码解释

1.从文件中加载 JSON 数据

QFile file("output.json");
if (!file.open(QIODevice::ReadOnly)) {qDebug() << "无法打开文件";return -1;
}
QByteArray data = file.readAll();
file.close();

使用 QFile 类读取文件内容,并将其存储在 QByteArray 中。

2.解析 JSON 数据

QJsonDocument doc;
doc.fromJson(data, doc);

使用 doc.fromJson() 方法将 JSON 字符串解析为 QJsonDocument 对象。

3.访问 JSON 数据

const QJsonObject& rootObject = doc.object();
for (const QString& key : rootObject.keys()) {const QVariant& value = rootObject[key];qDebug() << key << ":" << value;
}

可以通过键值对的方式访问 JSON 对象中的数据。

总结

        通过上述步骤,我们已经成功地生成并解析了 JSON 数据。Qt 提供了丰富的类来处理 JSON 数据,使得开发者能够轻松地将数据序列化为 JSON 格式,或者从文件中反序列化为 Qt 对象。


http://www.ppmy.cn/embedded/177683.html

相关文章

ai画图comfyUI lora风格特化。

基础功能下&#xff0c;单一lora。lora是对模型小规模特训&#xff0c;需要单独下载&#xff0c;放在lora文件夹。先直接运行&#xff0c;生成的类似娃娃手办图。然后&#xff0c;删掉这个lora节点&#xff0c;如果要添加就在空白处双击或右键添加节点&#xff0c;搜索lora&…

每日算法-250328

记录今天学习和解决的LeetCode算法题。 92. 反转链表 II 题目 思路 本题要求反转链表中从 left 到 right 位置的节点。我们可以采用 头插法 的思路来反转指定区间的链表。 具体来说&#xff0c;我们首先定位到 left 位置节点的前一个节点 prev。然后&#xff0c;从 left 位置…

基于python的租房数据分析系统(爬虫爬取真实数据)

项目介绍 本租房数据分析系统具备创新爬虫功能&#xff0c;能从安居客实时抓取房屋信息&#xff0c;同时提供全面的用户管理、个人中心服务。系统支持房屋信息的新增、修改、删除、查询及用户评论&#xff0c;以及租房数据的全面管理分析。此外&#xff0c;房屋资讯管理和轮播图…

微信小程序报错:600001 ERR_CERT_AUTHORITY_INVALID 的问题排查及解决

一、问题描述 最近有小伙伴私信我排查一个微信小程序的问题&#xff1a; 在真机上测试请求https://xxx.yyyy.com:8091域名接口的时候遇到了600001的错误&#xff0c;而请求https://xxx.yyyy.com域名接口的时候却正常。 request:fail errcode:-202 cronet error code:-202 err…

AI玩具迎来爆发式增长,IoT行业如何抓住机遇?

最近这两年&#xff0c;AI技术的迅猛发展&#xff0c;对整个社会产生了深远影响。各行各业都在经历AI所带来的变革。很多的产品&#xff0c;正在加速融入AI元素。 玩具产业及其产品也不例外。想必大家已经注意到相关新闻&#xff0c;许多制造商正积极将AI大模型技术与传统玩具相…

第P9周:YOLOv5-Backbone模块实现

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 Backbone 模块主要用于提取图像的多层级特征&#xff0c;采用 CSP 结构优化计算效率&#xff0c;并结合多尺度特征提取机制&#xff0c;提高目标检测的准确性…

【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置

噩梦终结&#xff1a;Flutter 配安卓、鸿蒙、iOS 真机调试环境 问题背景 很多开发者在配置 Flutter 项目环境时遇到困难&#xff0c;尤其是在处理 Android、鸿蒙和 iOS 真机调试环境时。卓伊凡最近接手了一个项目&#xff0c;发现很多“专业程序员”在环境搭建上花费了大量时…

数据结构每日一题day3(顺序表)★★★★★

题目描述&#xff1a;顺序表L的元素递增有序排列&#xff0c;设计一个算法在插入元素x后保持该顺序表仍然递增有序排列,插入成功后返回插入元素所在位置,不成功返回-1 算法思想&#xff1a;在递增有序的顺序表中插入元素 x 并保持有序性&#xff0c;步骤如下&#xff1a; 合法…