QT编程之JSON处理

devtools/2025/3/15 12:29:07/
一、核心类库及功能

Qt 提供了一套完整的 JSON 处理类库(位于 QtCore 模块),支持解析和生成 JSON 数据:

  • ‌QJsonDocument‌:表示完整的 JSON 文档,支持从 QJsonObject 或 QJsonArray 初始化‌。
  • ‌QJsonObject‌:用于构建和操作键值对结构的 JSON 对象,支持插入、查询、删除键值对‌。
  • ‌QJsonArray‌:处理有序值集合的 JSON 数组,可通过索引访问和修改元素‌。
  • ‌QJsonValue‌:封装 JSON 基本数据类型(字符串、数值、布尔值、空值、对象、数组)‌。
二、JSON 解析流程
  1. 读取文件数据
    使用 QFile 读取 JSON 文件并转换为 QByteArray

    QFile file("data.json");
    if (file.open(QIODevice::ReadOnly)) {QByteArray jsonData = file.readAll();file.close();
    }
  2. 解析为 JSON 文档
    通过 QJsonDocument::fromJson() 解析数据:

    QJsonDocument doc = QJsonDocument::fromJson(jsonData);
    if (doc.isNull()) {qDebug() << "解析失败";return;
    }
  3. 提取数据内容
    根据文档类型(对象或数组)获取数据:

    // 对象类型
    QJsonObject rootObj = doc.object();
    QString name = rootObj["name"].toString();
    int version = rootObj["version"].toInt();// 数组类型
    QJsonArray arr = doc.array();
    for (const QJsonValue &val : arr) {qDebug() << val.toString();
    }
三、JSON 数据生成方法
  1. 构建数据结构
    通过 QJsonObject 和 QJsonArray 组织数据:

    QJsonObject obj;
    obj.insert("project", "Qt Demo");
    obj.insert("version", 6.5);QJsonArray plugins;
    plugins.append("Core");
    plugins.append("GUI");
    obj.insert("plugins", plugins);
  2. 生成 JSON 文档
    将对象或数组封装为 QJsonDocument,并序列化为字符串:

    QJsonDocument doc(obj);
    QString jsonStr = doc.toJson(QJsonDocument::Compact);  // 紧凑格式
    // 或 doc.toJson(QJsonDocument::Indented);  // 带缩进的格式
四、结构体与 JSON 的转换

可通过模板或宏实现结构体与 JSON 的自动转换(需借助第三方库如 x2struct):

struct Config {QString host;int port;XTOSTRUCT(O(host, port));  // 声明可序列化字段
};// 结构体转 JSON
Config cfg{"127.0.0.1", 8080};
QString json = X::tojson(cfg);  // 生成 {"host":"127.0.0.1","port":8080}// JSON 转结构体
Config newCfg;
X::fromjson(json.toStdString(), newCfg);
五、优化与注意事项
  1. 性能优化

    • 优先使用 QJsonDocument::fromJson(),其性能在 Qt 5.15+ 中已优化‌。
    • 处理大文件时,避免频繁操作 QJsonObject 或 QJsonArray,可分批解析‌。
  2. 常见问题

    • ‌键名检查‌:严格匹配键名大小写,避免因拼写错误导致解析失败‌。
    • ‌数值精度‌:JSON 中数值类型为 double,转换整数时需显式调用 toInt()‌。
    • ‌嵌套结构‌:建议分层解析,避免深层嵌套导致代码复杂度增加‌。

http://www.ppmy.cn/devtools/167288.html

相关文章

虚拟展览馆小程序:数字艺术与文化展示的新形式探索

虚拟展览馆小程序:数字艺术与文化展示的新形式探索 一、传统展览的痛点:物理空间的局限与数字化的必然 在传统的艺术与文化展览中,观众往往需要跨越地理距离、排队数小时才能进入展馆,而许多珍贵展品因保护需求无法长期展出。数据显示,全球90%以上的博物馆藏品常年沉睡于…

39. HarmonyOS NEXT Layout布局组件系统详解(六):偏移功能实现

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT Layout布局组件系统详解&#xff08;六&#xff09;&#xff1a;偏移功能实现 文章目录 HarmonyOS NEXT Layout布局组件系统详解&a…

【零基础入门unity游戏开发——进阶篇】Unity Microphone类处理麦克风相关信息,录制音频并实时处理或保存录制的音频数据

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…

部署项目至服务器:响应时间太长,无法访问此页面?

在我们部署项目到服务器上的时候&#xff0c;一顿操作猛如虎&#xff0c;打开页面..... 这里记录一下这种情况是怎么回事。一般就是服务器上的安全组没有放行端口。 因为我是用宝塔进行项目部署的。所以遇到这种情况&#xff0c;要去操作两边&#xff08;宝塔and服务器所属平台…

吴恩达机器学习笔记复盘(三)Jupyter NoteBook

Jupyter NoteBook Jupyter是一个开源的交互式计算环境&#xff1a; 特点 交互式编程&#xff1a;支持以单元格为单位编写和运行代码&#xff0c;用户可以实时看到代码的执行结果&#xff0c;便于逐步调试和理解代码逻辑。多语言支持&#xff1a;不仅支持Python&#xff0c;还…

解决Docker Desktop中ext4.vhdx文件过大的问题

ext4.vhdx是Docker Desktop在Windows系统上使用WSL2&#xff08;Windows Subsystem for Linux 2&#xff09;时&#xff0c;用于存储Linux文件系统的虚拟硬盘文件。 基本概念 VHDX格式&#xff1a;VHDX是微软推出的一种虚拟硬盘格式&#xff0c;具有更大的存储容量、更好的性能…

DeepSeek R1在医院后勤故障报修工单自动化处理中的路径设计

一、总论 随着现代医院管理对信息化、自动化的要求不断提高&#xff0c;传统的人工操作和手工记录已经无法满足高效、精确、及时的需求&#xff0c;尤其在医院后勤的故障报修处理中&#xff0c;人工操作不仅耗时且容易出错。因此&#xff0c;构建一个智能化、自动化的故障报修…

C语言从入门到精通

主要内容 1. 基础知识 C语言概述&#xff1a;介绍C语言的历史、特点和发展。 数据类型&#xff1a;讲解基本数据类型、常量、变量及其存储类别。 运算符与表达达&#xff1a;涵盖赋值、算术、关系、逻辑等运算符和表达式。 输入输出函数&#xff1a;介绍字符、字符串和格式化的…