Qt中解析JSON文件

Qt中解析JSON文件

在Qt中解析JSON字符串主要有兩種方式:使用QJsonDocument類或使用QJsonDocument結合QVariant。以下是詳細的解析方法:

使用QJsonDocument(推薦)

這種方式的主要相關類如下:

QJsonDocument: QJsonDocument 是 Qt 中處理 JSON 數據的核心類,它提供了在內存中讀寫 JSON 文檔的功能。

主要功能

  1. 解析 JSON:從 UTF-8 編碼的文本創建 JSON 文檔
  2. 生成 JSON:將內存中的 JSON 數據轉換為字符串或二進制格式
  3. 數據訪問:提供對 JSON 對象和數組的訪問接口
  4. 格式轉換:支持緊湊和縮進兩種輸出格式

QJsonObject:QJsonObject 是 Qt 中用于表示 JSON 對象的類,它存儲鍵值對集合,其中鍵是字符串,值可以是各種 JSON 類型。

主要特性

  • 鍵值對存儲:存儲 QString 作為鍵,QJsonValue 作為值
  • 無序集合:鍵的順序不保證與插入順序一致
  • 隱式共享:使用寫時復制技術,拷貝開銷小
  • 類型安全:提供多種類型檢查和轉換方法

QJsonValue:

QJsonValue 是 Qt 中表示 JSON 值的類,它可以存儲 JSON 標準支持的所有數據類型。它是 Qt JSON 系統的核心基礎類。

主要特性

  • 多類型存儲:可以存儲 JSON 支持的所有數據類型
  • 值語義:拷貝和賦值操作是高效的(隱式共享)
  • 類型安全:提供嚴格的類型檢查和轉換方法
  • 空值和未定義值:支持 JSON null 和未定義值

支持的數據類型

QJsonValue 可以存儲以下類型的值:

類型描述對應的 Qt 類型
NullJSON null 值QJsonValue::Null
Bool布爾值bool
Double雙精度浮點數double
String字符串QString
ArrayJSON 數組QJsonArray
ObjectJSON 對象QJsonObject
Undefined未定義值(無效值)QJsonValue::Undefined

QJsonArray:

QJsonArray 是 Qt 中用于表示 JSON 數組的類,它存儲有序的 QJsonValue 集合。JSON 數組是值的有序列表,可以包含不同類型的元素。

主要特性

  • 有序集合:元素保持插入順序
  • 混合類型:可以存儲不同類型的值
  • 隱式共享:使用寫時復制技術,拷貝開銷小
  • 動態大小:支持動態添加和刪除元素
  • 索引訪問:支持通過索引隨機訪問元素

下面我們就用進行簡單的實戰解析。

一、解析簡單Json對象

#include <QCoreApplication>
#include<QJsonDocument>
#include<QJsonObject>
#include<QJsonValue>
#include<QJsonArray>void PraseJson()
{QString strJson = R"({"name":"張三","age":30,"isStudent":false})";QJsonDocument doc = QJsonDocument::fromJson(strJson.toUtf8());if(doc.isNull() || !doc.isObject()){qDebug() << "Json解析失敗";return;}QJsonObject obj = doc.object();QString strName = obj["name"].toString();int nAge = obj["age"].toInt();bool bStudent = obj["isStudent"].toBool();qDebug() << "名字:" << strName;qDebug() << "年齡:" << nAge;qDebug() << "是否學生:" << bStudent;}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// Set up code that uses the Qt event loop here.// Call a.quit() or a.exit() to quit the application.// A not very useful example would be including// #include <QTimer>// near the top of the file and calling// QTimer::singleShot(5000, &a, &QCoreApplication::quit);// which quits the application after 5 seconds.// If you do not need a running Qt event loop, remove the call// to a.exec() or use the Non-Qt Plain C++ Application template.PraseJson();return a.exec();
}

代碼運行結果:

wechat_2025-09-13_104418_550

二、解析嵌套Json對象

void PraseJson2()
{QString strJson = R"({"person":{"name":"李四","address":{"city":"北京","street":"長安街"}},"hobbies":["讀書","音樂","運動"]})";QJsonDocument doc = QJsonDocument::fromJson(strJson.toUtf8());if(doc.isNull() || !doc.isObject()){qDebug() << "Json解析失敗";return;}QJsonObject rootObj = doc.object();QJsonObject personObj = rootObj["person"].toObject();QJsonObject addressObj = personObj["address"].toObject();QString strName = personObj["name"].toString();qDebug() << "名字:" << strName;QString strCity = addressObj["city"].toString();qDebug() << "城市" << strCity;QString strStreet = addressObj["street"].toString();qDebug() << "街道:" << strStreet;QJsonArray arr = rootObj["hobbies"].toArray();qDebug() << "愛好:";for (const QJsonValue& value: arr){qDebug() << value.toString();}}

代碼運行結果:

wechat_2025-09-13_112527_476

三、解析Json數組

void PraseJson3()
{QString strJson = R"([{"name":"王五","age":30},{"name":"趙六","age":35},{"name":"張三","age":20}])";QJsonDocument doc = QJsonDocument::fromJson(strJson.toUtf8());if(doc.isNull()){qDebug() << "Json解析失敗";return;}if(doc.isArray()){QJsonArray arr = doc.array();for(const QJsonValue& value:arr){QJsonObject obj = value.toObject();qDebug() << "名字:"<< obj["name"].toString() << ",年齡:" << obj["age"].toInt();}}
}

代碼運行結果:

wechat_2025-09-13_115755_115

四、錯誤處理

void parseJsonWithErrorHandling() {QString jsonString = R"({"invalid": json})"; // 無效的JSONQJsonParseError error;QJsonDocument doc = QJsonDocument::fromJson(jsonString.toUtf8(), &error);if (error.error != QJsonParseError::NoError) {qDebug() << "JSON解析錯誤:" << error.errorString();return;}if (doc.isNull()) {qDebug() << "文檔為空";return;}// 安全地獲取值QJsonObject obj = doc.object();QString value = obj.value("key").toString("默認值"); // 如果key不存在,返回默認值// 檢查值類型if (obj.contains("key") && obj["key"].isString()) {// 安全處理}
}

五、構建Json對象

void createJson() {QJsonObject person;person["name"] = "張三";person["age"] = 30;QJsonArray hobbies;hobbies.append("讀書");hobbies.append("游泳");hobbies.append("編程");person["hobbies"] = hobbies;QJsonObject address;address["city"] = "上海";address["street"] = "南京路";person["address"] = address;QJsonDocument doc(person);QString jsonString = doc.toJson(QJsonDocument::Indented);qDebug() << "生成的JSON:";qDebug() << jsonString;
}

代碼運行結果:

wechat_2025-09-13_121120_222

注意事項

  1. 編碼問題: 確保JSON字符串使用UTF-8編碼
  2. 錯誤處理: 總是檢查解析是否成功
  3. 類型安全: 在訪問值之前檢查其類型
  4. 內存管理: Qt的JSON類使用隱式共享,無需擔心深拷貝性能問題

常用方法

  • QJsonDocument::fromJson() - 從字符串創建文檔
  • QJsonObject::value() - 安全獲取值(可指定默認值)
  • QJsonValue::toInt(), toString(), toBool() - 類型轉換
  • QJsonObject::contains() - 檢查鍵是否存在
  • QJsonValue::isObject(), isArray(), isString() - 檢查值類型

: Qt的JSON類使用隱式共享,無需擔心深拷貝性能問題

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/922232.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/922232.shtml
英文地址,請注明出處:http://en.pswp.cn/news/922232.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度解析HTTPS:從加密原理到SSL/TLS的演進之路

在互聯網時代,數據安全已成為不可忽視的基石。當我們在瀏覽器地址欄看到"https://"前綴和那把小小的綠色鎖圖標時,意味著正在進行一場受保護的通信。但這層保護究竟是如何實現的?HTTPS、SSL和TLS之間又存在著怎樣的聯系與區別?本文將深入剖析這些技術細節,帶你全…

Flutter 官方 LLM 動態 UI 庫 flutter_genui 發布,讓 App UI 自己生成 UI

今日&#xff0c;Flutter 官方正式發布了它們關于 AI 大模型的 package 項目&#xff1a; genui &#xff0c;它是一個非常有趣和前沿的探索類型的項目&#xff0c;它的目標是幫助開發者構建由生成式 AI 模型驅動的動態、對話式用戶界面&#xff1a; 也就是它與傳統 App 中“寫…

Redis常用數據結構及其底層實現

Redis常用數據結構主要有String List Set Zset Hash BitMap Hyperloglog Stream GeoString:Redis最常用的一種數據結構,Sting類型的數據存儲結構有三種int、embstr、raw1.int:用來存儲long以下的整形embstr raw 都是用來存字符串&#xff0c;其中小于44字節的字符串用embstr存 …

O3.4 opencv圖形拼接+答題卡識別

一圖形拼接邏輯導入必要的庫pythonimport cv2 import numpy as np import sys導入cv2庫用于圖像處理&#xff0c;numpy庫用于數值計算&#xff0c;sys庫用于與 Python 解釋器進行交互&#xff0c;例如退出程序。定義圖像顯示函數def cv_show(name, img):cv2.imshow(name, img)c…

SQL注入常見攻擊點與防御詳解

SQL注入是一種非常常見且危險的Web安全漏洞。攻擊者通過將惡意的SQL代碼插入到應用程序的輸入參數中&#xff0c;欺騙后端數據庫執行這些非預期的命令&#xff0c;從而可能竊取、篡改、刪除數據或獲得更高的系統權限。以下是詳細、準確的SQL注入點分類、說明及舉例&#xff1a;…

EKSPod 資源利用率配置修復:從占位符到完整資源分析系統

概述 在 Kubernetes 集群管理過程中,資源利用率的監控和優化是保證應用性能和成本效益的關鍵環節。近期,我們對 EKSPod 管理界面的資源利用率顯示功能進行了全面修復,將原先簡單的占位符文本升級為完整的資源分析系統。本文將詳細介紹這次修復的背景、方案、實現細節和最終…

Linux內核(架構)

文章目錄Linux內核架構概述核心子系統詳解1、進程管理2、內存管理3、虛擬文件系統(VFS)4、設備驅動模型掌握Linux內核核心技術階段1&#xff1a;基礎準備階段2&#xff1a;內核基礎階段3&#xff1a;深入子系統階段4&#xff1a;高級主題&#xff08;持續學習&#xff09;調試和…

基于數據挖掘的單純冠心病與冠心病合并糖尿病的證治規律對比研究

標題:基于數據挖掘的單純冠心病與冠心病合并糖尿病的證治規律對比研究內容:1.摘要 背景&#xff1a;冠心病和冠心病合并糖尿病在臨床上較為常見&#xff0c;且二者在證治方面可能存在差異&#xff0c;但目前相關系統研究較少。目的&#xff1a;對比基于數據挖掘的單純冠心病與冠…

即夢AI快速P圖

原圖&#xff1a; 模型選擇3.0效果比較好&#xff0c;提示詞“根據提供圖片&#xff0c;要求把兩邊臉變小&#xff0c;要求把臉變尖&#xff0c;要求眼妝變淡&#xff0c;眼睛更有神&#xff0c;要求提亮面部膚色要求面部均勻&#xff0c;面部要磨皮!鼻頭高光和鼻翼兩邊陰影變淡…

【辦公類-109-04】20250913圓牌卡片(接送卡被子卡床卡入園卡_word編輯單面)

背景需求: 為了發被子,我做了全校批量的圓形掛牌,可以綁在“被子包”提手上,便于再操場上發放被子時,很多老師可以協助根據學號發放。 https://blog.csdn.net/reasonsummer/article/details/149755556?spm=1011.2415.3001.5331https://blog.csdn.net/reasonsummer/arti…

Shoptnt 促銷計算引擎詳解:策略模式與責任鏈的完美融合

在電商系統中&#xff0c;促銷計算是業務邏輯最復雜、變更最頻繁的模塊之一。它不僅需要處理多種促銷類型&#xff08;滿減、折扣、優惠券等&#xff09;&#xff0c;還要管理它們之間的優先級和互斥關系。 Shoptnt 設計了一套基于 策略模式 (Strategy Pattern) 和 責任鏈模式…

【HTTP 請求格式】從請求行 到 請求體

引言 在前后端開發中&#xff0c;前端和后端之間的交互主要依賴于 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本傳輸協議&#xff09;。HTTP 是互聯網通信的基礎&#xff0c;它定義了客戶端&#xff08;通常是瀏覽器或App&#xff09;和服務器之間如何交換數…

【自記】SQL 中 GROUPING 和 GROUPING SETS 語句的案例說明

我們用一個生活中的例子來理解&#xff0c;比如你開了家小超市&#xff0c;想統計「銷售額」&#xff0c;但需要從多個角度看&#xff08;比如按 “日期 商品”、“僅日期”、“僅商品”、“整體總銷售額”&#xff09;。假設你的銷售數據長這樣&#xff08;簡化版&#xff09…

C語言第五課:if、else 、if else if else 控制語句

C語言第五課&#xff1a;if、else 、if else if else 控制語句if else 、if else if else 聯合使用編程快速學習平臺if else 、if else if else 聯合使用 代碼示列 #include <stdio.h> int main(){//設置中文編碼輸出到控制臺system("chcp 65001");//今天星…

七彩喜智慧養老:用科技溫暖晚年,讓關愛永不掉線

“當銀發潮遇見科技力&#xff0c;養老方式正在發生一場靜悄悄的變革。”你有沒有想過&#xff1a;當父母年邁獨居時&#xff0c;如何確保他們的安全&#xff1f;當老人突然摔倒&#xff0c;如何第一時間獲得救助&#xff1f;當慢性病需要長期管理&#xff0c;如何避免頻繁奔波…

window顯示驅動開發—為頭裝載和專用監視器生成自定義合成器應用(二)

顯示相關的 API 的比較 API用途和目標受眾DisplayInformation用于檢索 CoreWindow 的呈現和布局屬性。HdmiDisplayInformation用于枚舉和設置受限模式集的僅限 Xbox 的 API。 高度專用于 Xbox 媒體應用方案。DisplayMonitor用于查詢物理監視器設備的屬性。 不公開有關操作系統…

Linux 高性能 I/O 事件通知機制的核心系統調用—— `epoll_ctl`

epoll 是 Linux 上處理大量文件描述符 I/O 事件的高效模型&#xff0c;而 epoll_ctl 則是你用來指揮 epoll 實例&#xff08;epoll instance&#xff09;的“遙控器”&#xff0c;負責向它添加、修改或刪除需要監視的文件描述符&#xff08;FD&#xff09;及其感興趣的事件。1.…

mysql 必須在逗號分隔字符串和JSON字段之間二選一,怎么選

如果必須在逗號分隔字符串和JSON字段之間二選一&#xff0c;那么 JSON字段是明顯更好的選擇。以下是詳細的對比分析&#xff1a;對比結論&#xff08;直接看這里&#xff09;方面JSON字段逗號分隔字符串勝出方查詢能力? 豐富的JSON函數支持? 只能使用LIKE模糊查詢JSON數據驗證…

DPI和DIP的區別

DPI 和 DIP 是兩個在計算機圖形和移動開發領域常見的術語&#xff0c;它們都與屏幕顯示和尺寸有關&#xff0c;但含義和用途不同。 DPI (Dots Per Inch) 定義&#xff1a;DPI 的全稱是 Dots Per Inch&#xff0c;即每英寸點數。它是一個衡量物理密度的單位&#xff0c;表示在…

數據幫助我們理解未知世界

主持人 尼古拉安根&#xff1a; 大家好&#xff0c;我是挪威南方財富基金首席執行官尼古拉安根。今天非常榮幸能與大衛斯皮格爾哈爾特爵士對話。坦率地說&#xff0c;他不僅是世界上最優秀的統計學家之一&#xff0c;也是我見過的最佳風險溝通者。他撰寫了大量優秀著作&#xf…