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.pswp.cn/pingmian/72330.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72330.shtml
英文地址,請注明出處:http://en.pswp.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…