QT编程之JSON处理

一、核心类库及功能

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.mzph.cn/pingmian/72330.shtml

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

相关文章

在虚拟环境里面配置Linux系统

Linux系统有很多版本&#xff0c;常用的有Ubantu乌班图&#xff0c;和CentOS 不同的版本在使用的时候&#xff0c;有部分执行方式的不同 安装的流程都一样 首先&#xff0c;想要安装Ubantu&#xff0c;要去它的官网&#xff0c;找下载连接&#xff0c;然后下载iso后缀的安装…

CentOS7下安装MongoDB

步骤 1&#xff1a;创建 MongoDB Yum 仓库文件 你需要创建一个 MongoDB 的 Yum 仓库配置文件&#xff0c;以便从官方源下载 MongoDB。打开终端并使用以下命令创建并编辑该文件&#xff1a; sudo vi /etc/yum.repos.d/mongodb-org-7.0.repo 在打开的文件中&#xff0c;输入以下…

机器视觉工程师如何学习C#通讯

建议大家可以提前测试&#xff0c;真实模拟现场的情况&#xff0c;或者采用虚拟串口&#xff0c;虚拟网口频繁测试通讯的稳定性&#xff0c;以后有现场需要&#xff0c;可以快速布局到现场。 机器视觉工程师学习C#通讯协议需要结合工业场景需求&#xff0c;掌握基础协议原理、常…

40.动态规划13

回文子串 class Solution { public:int countSubstrings(string s) {int ns.size();vector<vector<int>> dp(n,vector<int>(n,0));int res0;for(int i0;i<n;i){for(int ji;j>0;j--){if(ij){dp[i][j]1;res;}else{if(s[i]s[j]){if(abs(i-j)<2){dp[i]…

基于ssm的一家运动鞋店的产品推广网站的设计

项目简介 一家运动鞋店实现了以下功能&#xff1a; 实现了用户在线选择试题并完成答题&#xff0c;在线查看考核分数。管理员管理收货地址管理、购物车管理、字典管理、留言版管理、新闻信息管理、产品管理、产品收藏管理、产品评价管理、产品订单管理、单页数据管理、用户管…

3.14学习总结

今天完成了几道关于二叉树的算法题 关于二叉树的最小最大深度和数据流中的第k大元素&#xff0c;用到优先队列&#xff0c;学习了有关java的基础知识&#xff0c;学习了双指针法。

spring boot3 kafka集群搭建到使用

首先自行安装docker&#xff0c;通过docker容器安装kafka CentOS 系统 docker安装地址 1.pom.xml和application.properties或者application.yml文件配置 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</arti…

基于 RWA 模型与 AI - Agent 协同的企业级 aPAAS 架构设计

一、引言 在企业数字化转型不断深化的当下&#xff0c;现实世界资产&#xff08;RWA&#xff09;模型与人工智能智能体&#xff08;AI - Agent&#xff09;的协同融合&#xff0c;为企业级应用平台即服务&#xff08;aPAAS&#xff09;架构的创新发展带来了新契机。这种架构旨在…

Flutter PopScope对于iOS设置canPop为false无效问题

这个问题应该出现很久了&#xff0c;之前的组件WillPopScope用的好好的&#xff0c;flutter做优化打算“软性”处理禁用返回手势&#xff0c;出了PopScope&#xff0c;这个组件也能处理在安卓设备上的左滑返回事件。但是iOS上面左滑返回手势禁用&#xff0c;一直无效。 当然之…

基尔霍夫定律课后学习日志

基尔霍夫定律课后日志 今天在学习基尔霍夫定律后&#xff0c;我对它在实际工程中的价值有了全新的认识。 基尔霍夫电流定律&#xff08;KCL&#xff09;和电压定律&#xff08;KVL&#xff09;是电路分析的基石。在电子电路设计领域&#xff0c;这两个定律发挥着关键作用。以…

矩阵交换行(信息学奥赛一本通-1119)

【题目描述】 给定一个55的矩阵(数学上&#xff0c;一个rc的矩阵是一个由r行c列元素排列成的矩形阵列)&#xff0c;将第n行和第m行交换&#xff0c;输出交换后的结果。 【输入】 输入共6行&#xff0c;前5行为矩阵的每一行元素,元素与元素之间以一个空格分开。 第6行包含两个整…

SWPU 2022 新生赛

webdog1__start if (isset($_GET[web])) {$first$_GET[web];if ($firstmd5($first)) md5 自等 web0e215962017 &#xff08;md5后也是 0e) 登入后得到提示&#xff0c;robots.txt 访问 f14g.php 返回包里发现 hint > if (isset($_GET[get])){$get$_GET[get];if(!strs…

什么是 Redis

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、基于内存的键值存储系统&#xff0c;常用作数据库、缓存和消息中间件。它支持多种数据结构&#xff0c;如字符串、哈希、列表、集合、有序集合等&#xff0c;并提供丰富的操作命令。 主要特点 高性能&am…

海数通-海员数字化管理平台(企业数字化)

产品介绍 海数通产品是一套海员数字化管理平台&#xff0c;为企业提供海员档案、海历、动态、证书、培训、晋升、薪资、社险等全流程多维度的智能化管理能力。薪资计算模型和社险计算模型能够自动并准确的完成复杂的工资、社险计算工作&#xff0c;极大的提高工作效率和准确性…

如何处理PHP中的日期和时间问题

如何处理PHP中的日期和时间问题 在PHP开发中&#xff0c;日期和时间的处理是一个常见且重要的任务。无论是记录用户操作时间、生成时间戳&#xff0c;还是进行日期计算&#xff0c;PHP提供了丰富的函数和类来帮助开发者高效处理这些需求。本文将详细介绍如何在PHP中处理日期和…

【SpringMVC】入门版

1.基本概念 1.1三层架构 三层架构也就是我们常说的b/s架构中的表现层&#xff0c;业务层和持久层,每层都各司其职&#xff0c;下面来分别讲解这三层的作用。 表现层&#xff1a; 也就是我们常说的web层。它负责接收客户端的请求&#xff0c;向客户端响应结果&#xff0c;通…

【Java进阶学习 第八篇】石头迷阵游戏

绘制页面 首先绘制指定宽和高的窗体 JFrame frame new JFrame();frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);frame.setSize(514,595);frame.setTitle("石头迷阵单机版v1.0");//想让游戏一直在屏幕的最上层frame.setAlwaysOnTop(true);//想让窗…

wireguard搭配udp2raw部署内网

前言 上一篇写了使用 wireguard 可以非常轻松的进行组网部署&#xff0c;但是如果服务器厂商屏蔽了 udp 端口&#xff0c;那就没法了 针对 udp 被服务器厂商屏蔽的情况&#xff0c;需要使用一款 udp2raw 或 socat 类似的工具&#xff0c;来将 udp 打包成 tcp 进行通信 这里以…

Node.js REPL 深入解析

Node.js REPL 深入解析 引言 Node.js 作为一种流行的 JavaScript 运行环境,在服务器端开发中扮演着重要角色。REPL(Read-Eval-Print Loop,读取-求值-打印循环)是 Node.js 的一个核心特性,它允许开发者在一个交互式环境中执行 JavaScript 代码。本文将深入探讨 Node.js R…

系统可观测性(5)OpenTelemetry基础使用

系统可观测性(5)OpenTelemetry基础概念 Author: Once Day Date: 2025年3月12日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 本文档翻译整理自《OpenTelemetry Docs》&a…