QT數據交互全解析:JSON處理與HTTP通信
目錄
- JSON數據格式概述
- QT JSON核心類
- JSON生成與解析實戰
- HTTP通信實現
- JSON+HTTP綜合應用
1. JSON數據格式概述
JSON(JavaScript Object Notation)是輕量級的數據交換格式:
基本語法規則:
- 數據為鍵值對
"key": value
- 數據由逗號分隔
- 大括號
{}
保存對象 - 中括號
[]
保存數組
2. QT JSON核心類
JSON處理四大核心類:
類名 | 作用 | 常用方法 |
---|---|---|
QJsonDocument | JSON文檔容器 | fromJson() , toJson() |
QJsonObject | JSON對象(鍵值對集合) | insert() , value() |
QJsonArray | JSON數組(值的有序列表) | append() , at() |
QJsonValue | JSON值(支持多種類型) | 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通信核心類:
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網絡模塊
原創技術筆記,轉載需注明出處。更多系統編程內容持續更新中…