一、核心類庫及功能
Qt 提供了一套完整的 JSON 處理類庫(位于?QtCore
?模塊),支持解析和生成 JSON 數據:
- ?QJsonDocument?:表示完整的 JSON 文檔,支持從?
QJsonObject
?或?QJsonArray
?初始化?。 - ?QJsonObject?:用于構建和操作鍵值對結構的 JSON 對象,支持插入、查詢、刪除鍵值對?。
- ?QJsonArray?:處理有序值集合的 JSON 數組,可通過索引訪問和修改元素?。
- ?QJsonValue?:封裝 JSON 基本數據類型(字符串、數值、布爾值、空值、對象、數組)?。
二、JSON 解析流程
-
?讀取文件數據?
使用?QFile
?讀取 JSON 文件并轉換為?QByteArray
:QFile file("data.json"); if (file.open(QIODevice::ReadOnly)) {QByteArray jsonData = file.readAll();file.close(); }
-
?解析為 JSON 文檔?
通過?QJsonDocument::fromJson()
?解析數據:QJsonDocument doc = QJsonDocument::fromJson(jsonData); if (doc.isNull()) {qDebug() << "解析失敗";return; }
-
?提取數據內容?
根據文檔類型(對象或數組)獲取數據:// 對象類型 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 數據生成方法
-
?構建數據結構?
通過?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);
-
?生成 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);
五、優化與注意事項
-
?性能優化?
- 優先使用?
QJsonDocument::fromJson()
,其性能在 Qt 5.15+ 中已優化?。 - 處理大文件時,避免頻繁操作?
QJsonObject
?或?QJsonArray
,可分批解析?。
- 優先使用?
-
?常見問題?
- ?鍵名檢查?:嚴格匹配鍵名大小寫,避免因拼寫錯誤導致解析失敗?。
- ?數值精度?:JSON 中數值類型為?
double
,轉換整數時需顯式調用?toInt()
?。 - ?嵌套結構?:建議分層解析,避免深層嵌套導致代碼復雜度增加?。