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网络模块
原创技术笔记,转载需注明出处。更多系统编程内容持续更新中…