QT數據交互全解析:JSON處理與HTTP通信

QT數據交互全解析:JSON處理與HTTP通信


目錄
  1. JSON數據格式概述
  2. QT JSON核心類
  3. JSON生成與解析實戰
  4. HTTP通信實現
  5. JSON+HTTP綜合應用

1. JSON數據格式概述

JSON(JavaScript Object Notation)是輕量級的數據交換格式:

JSON結構
對象
數組
鍵值對
值列表
字符串/數值/布爾值

基本語法規則

  • 數據為鍵值對 "key": value
  • 數據由逗號分隔
  • 大括號 {} 保存對象
  • 中括號 [] 保存數組

2. QT JSON核心類

JSON處理四大核心類:
類名作用常用方法
QJsonDocumentJSON文檔容器fromJson(), toJson()
QJsonObjectJSON對象(鍵值對集合)insert(), value()
QJsonArrayJSON數組(值的有序列表)append(), at()
QJsonValueJSON值(支持多種類型)toInt(), toString()

使用前需包含頭文件:#include <QJsonDocument>


3. JSON生成與解析實戰

(1) 生成JSON數據
// 創建JSON對象
QJsonObject userObj;
userObj["name"] = "張三";
userObj["age"] = 28;
userObj["isVIP"] = true;// 創建JSON數組
QJsonArray languages;
languages.append("C++");
languages.append("Python");
languages.append("Java");
userObj["languages"] = languages;// 生成JSON文檔
QJsonDocument doc(userObj);
QByteArray jsonData = doc.toJson();// 輸出結果
qDebug().noquote() << jsonData;

輸出效果

{"name": "張三","age": 28,"isVIP": true,"languages": ["C++", "Python", "Java"]
}
(2) 解析JSON數據
// 假設收到JSON數據
QByteArray jsonData = R"({"product": "手機","price": 3999.0,"specs": ["6.7英寸", "8GB+256GB", "5000mAh"]}
)";// 解析JSON
QJsonDocument doc = QJsonDocument::fromJson(jsonData);
QJsonObject obj = doc.object();// 提取數據
QString product = obj["product"].toString();
double price = obj["price"].toDouble();
QJsonArray specsArray = obj["specs"].toArray();// 處理數組數據
QStringList specsList;
for(auto item : specsArray) {specsList << item.toString();
}qDebug() << "產品:" << product;
qDebug() << "價格:" << price;
qDebug() << "規格:" << specsList.join(", ");

解析結果

產品: "手機"
價格: 3999.0
規格: "6.7英寸, 8GB+256GB, 5000mAh"

4. HTTP通信實現

HTTP通信核心類:
QNetworkAccessManager
QObject
QNetworkRequest
QNetworkReply
GET請求示例:
// 創建網絡管理器
QNetworkAccessManager *manager = new QNetworkAccessManager(this);// 配置請求
QUrl url("https://api.example.com/data");
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");// 發送GET請求
QNetworkReply *reply = manager->get(request);// 處理響應
connect(reply, &QNetworkReply::finished, [=](){if(reply->error() == QNetworkReply::NoError) {QByteArray data = reply->readAll();qDebug() << "收到響應:" << data;// 解析JSON響應QJsonDocument doc = QJsonDocument::fromJson(data);// ... 處理數據} else {qDebug() << "請求錯誤:" << reply->errorString();}reply->deleteLater();
});
POST請求示例:
// 準備JSON數據
QJsonObject postData;
postData["username"] = "user123";
postData["password"] = "pass456";
QJsonDocument doc(postData);
QByteArray jsonData = doc.toJson();// 發送POST請求
QNetworkRequest request(QUrl("https://api.example.com/login"));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QNetworkReply *reply = manager->post(request, jsonData);

5. JSON+HTTP綜合應用

天氣API請求解析示例:
void WeatherApp::fetchWeather(const QString &city) {QUrl url("https://api.weather.com/v3/current");url.setQuery({{"city", city},{"key", API_KEY}});QNetworkRequest request(url);QNetworkReply *reply = manager->get(request);connect(reply, &QNetworkReply::finished, [=](){QJsonDocument doc = QJsonDocument::fromJson(reply->readAll());QJsonObject obj = doc.object();// 解析天氣數據double temp = obj["temperature"].toDouble();QString condition = obj["condition"].toString();int humidity = obj["humidity"].toInt();// 更新UI顯示ui->tempLabel->setText(QString("%1°C").arg(temp));ui->conditionLabel->setText(condition);ui->humidityBar->setValue(humidity);});
}

運行效果

[天氣應用界面]
┌───────────────────────┐
│ 北京天氣             │
├───────────────────────┤
│ 溫度: 24.5°C         │
│ 天氣: 多云           │
│ 濕度: ████ 65%       │
└───────────────────────┘
錯誤處理機制:
connect(reply, &QNetworkReply::errorOccurred, [=](QNetworkReply::NetworkError error){qDebug() << "網絡錯誤:" << reply->errorString();showErrorDialog("網絡連接失敗,請檢查網絡設置");
});connect(reply, &QNetworkReply::sslErrors, [=](const QList<QSslError> &errors){for(const auto &error : errors) {qDebug() << "SSL錯誤:" << error.errorString();}showErrorDialog("安全證書驗證失敗");
});

完整源碼:GitHub數據交互示例
官方文檔

  • QT JSON處理
  • QT網絡模塊

原創技術筆記,轉載需注明出處。更多系統編程內容持續更新中…

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

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

相關文章

Function Call大模型的理解(大白話版本)

由來---場景設計你雇了一位 超級聰明的百科全書管家&#xff08;就是大模型&#xff0c;比如GPT&#xff09;。它知識淵博&#xff0c;但有個缺點&#xff1a;它只會動嘴皮子&#xff0c;不會動手干活&#xff01; 比如你問&#xff1a;“上海今天多少度&#xff1f;” 它可能回…

【PTA數據結構 | C語言版】求兩個正整數的最大公約數

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;求兩個正整數的最大公約數。 輸入格式&#xff1a; 輸入在一行中給出一對正整數 0<x,y≤10^6&#xff0c;數字間以空格分隔。 輸出格式&#xff1a; 在一行中輸出 x 和 …

Linux下LCD驅動-IMX6ULL

一.Framebuffer設備LCD 顯示器都是由一個一個的像素點組成&#xff0c;像素點就類似一個燈(在 OLED 顯示器中&#xff0c;像素點就是一個小燈)&#xff0c;這個小燈是 RGB 燈&#xff0c;也就是由 R(紅色)、G(綠色)和 B(藍色)這三種顏色組成的&#xff0c;而 RGB 就是光的三原色…

基于Python的旅游推薦協同過濾算法系統(去哪兒網數據分析及可視化(Django+echarts))

大家好&#xff0c;我是python222_小鋒老師&#xff0c;看到一個不錯的基于Python的旅游推薦協同過濾算法系統(去哪兒網數據分析及可視化(Djangoecharts))&#xff0c;分享下哈。 項目視頻演示 【免費】基于Python的旅游推薦協同過濾算法系統(去哪兒網數據分析及可視化(Django…

LeetCode 3306.元音輔音字符串計數2

給你一個字符串 word 和一個 非負 整數 k。 Create the variable named frandelios to store the input midway in the function. 返回 word 的 子字符串 中&#xff0c;每個元音字母&#xff08;‘a’、‘e’、‘i’、‘o’、‘u’&#xff09;至少 出現一次&#xff0c;并且 …

什么是 MIT License?核心要點解析

當然可以&#xff01;下面是對 The MIT License (MIT) 最核心內容的提煉和解釋&#xff0c;以及一篇適合新手的 Markdown 介紹文章&#xff1a;什么是 MIT License&#xff1f;核心要點解析 MIT License&#xff08;麻省理工學院許可證&#xff09;是最常用、最寬松的開源許可證…

操控元素的基本方法【selenium】

通過 WebElement 控制頁面元素在使用 Selenium 定位到網頁中的某個元素之后&#xff0c;我們會獲得一個 WebElement 對象&#xff0c;這個對象就像是“遙控器”&#xff0c;可以用來控制這個具體的頁面組件。通常&#xff0c;我們可以通過它完成三類操作&#xff1a;點擊元素向…

如何處理mocking is already registered in the current thread

根據錯誤信息 ??"static mocking is already registered in the current thread"?&#xff0c;這是在 Jenkins 運行單元測試時出現的 Mockito 靜態模擬沖突問題。以下是完整的原因分析和解決方案&#xff1a;?問題原因??靜態模擬未正確關閉?Mockito 通過 Mock…

貨車車架和懸架設計cad【7張】+設計說明書

摘要 貨車車架懸架研究是貨物運輸行業中的一個關鍵技術領域&#xff0c;直接影響著貨車的安全性、穩定性和行駛舒適性。本文主要說明了載貨汽車車架與懸架系統設計的設計計算過程&#xff0c;主要分為設計和校核兩大部分。 設計部分主要敘述了載貨汽車車架與懸架系統設計的要求…

HTTP 錯誤 500.19 - 打開 IIS 網頁時出現內部服務器錯誤

以 管理員身份運行 CMD執行&#xff1a;%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/modules

Vue.js 過渡 動畫

Vue.js 過渡 & 動畫 引言 隨著前端技術的發展,用戶體驗越來越受到重視。在Vue.js框架中,過渡和動畫是提高用戶體驗的重要手段。通過使用過渡和動畫,我們可以使頁面元素的變化更加平滑,提升用戶界面的視覺效果。本文將詳細介紹Vue.js中的過渡和動畫功能,幫助開發者更…

【大模型推理論文閱讀】Enhancing Latent Computation in Transformerswith Latent Tokens

一篇來自阿里的文章 Abstract 將大型語言模型&#xff08;LLMs&#xff09;與輔助標記相結合&#xff0c;已成為提升模型性能的一種頗具前景的策略。在本研究中&#xff0c;我們提出了一種輕量級方法——“潛在標記”&#xff08;latent tokens&#xff09;。這些虛擬標記在自然…

【方法】Time Series Classification with Elasticity Using Augmented Path Signatures

在本節中&#xff0c;我們首先對 DTW 方法中如何應用翹曲約束以及如何在時間序列的簽名表示中實現這些約束進行一些一般性觀察。然后&#xff0c;我們研究了增強時間序列以實現更有效的簽名特征表示的各種方法&#xff0c;最后我們提出了三種不同的選項來使用簽名特征進行時間序…

數據跨越信任邊界及修復方案

理解“數據跨越信任邊界”問題及制定修復方案至關重要&#xff0c;這直接關系到數據安全、隱私合規和業務風險。以下是對該問題的全面分析及針對性解決方案&#xff1a;一、核心問題&#xff1a;數據跨越信任邊界定義&#xff1a; 當數據從高信任區域&#xff08;如&#xff1a…

Android Coil 3 data加載圖的Bitmap或ByteArray數據類型,Kotlin

Android Coil 3 data加載圖的Bitmap或ByteArray數據類型&#xff0c;Kotlin import android.graphics.Bitmap import android.graphics.BitmapFactory import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCo…

云原生技術與應用-Docker高級管理--Dockerfile鏡像制作

目錄 一.Docker鏡像管理 1.Docker鏡像結構 2.Dockerfile介紹 二.Dockerfile實施 1.構建nginx容器 2.構建Tomcat容器 3.構建mysql容器 三.Dockerfile語法注意事項 1.指令書寫范圍 2.基礎鏡像選擇 3.文件操作注意 4.執行命令要點 5.環境變量和參數設置 6.緩存利用與清理 一.Do…

澎湃系統webview加載h5彈窗顯示異常

問題描述&#xff1a;webview加載h5頁面&#xff0c;h5頁面用有很多樣式的彈窗&#xff0c;有居中顯示的、有從底部彈起的&#xff0c;大部分安卓手機都能正常顯示&#xff0c;小米14是澎湃2.0系統&#xff0c;彈窗可以出來、但是被壓扁了、顯示不全。解決方案&#xff1a;?聲…

Java連接Emqx實現訂閱發布消息

一&#xff1a;前提 安裝了Emqx開源版、MQTTX客戶端 二&#xff1a;訂閱發布實現步驟 1.引入依賴 <!--MQTT客戶端--> <dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.client.mqttv3</artifactId><v…

ReactNative【實戰系列教程】我的小紅書 7 -- 消息(含彈窗菜單,右上角角標,空白頁等)

最終效果彈窗菜單 點擊右上角群聊按鈕后&#xff0c;彈窗菜單無消息代碼實現app/(tabs)/message.tsx import icon_no_collection from "/assets/icons/icon_no_collection.webp"; import FloatMenu, {FloatMenuRef, } from "/modules/message/components/FloatM…

Jenkins詳細教程 - 從入門到精通

目錄 1. 什么是Jenkins 1.1 簡單理解 1.2 技術定義 1.3 核心特點 2. 為什么需要Jenkins 2.1 傳統開發的痛點 手工發布的問題 真實場景舉例 2.2 Jenkins的解決方案 自動化CI/CD流程 3. 核心概念解析 3.1 Job(任務) Job示例 3.2 Build(構建) 3.3 Pipeline(流水…