7.8 QMap
在 Qt 中,如果你想要将 JSON 数据解析到一个 QMap 中,你可以遍历 JSON 对象的所有键值对,并将它们添加到 QMap 里。这个方法特别适合于当你的 JSON 对象是一个简单的键值对集合时。以下是一个如何实现这一点的示例。
示例:将 JSON 数据解析到 QMap 中
假设你有以下 JSON 数据:
json
{
"name" : "John Doe" ,
"age" : "30" ,
"email" : "john.doe@example.com"
}
以下是如何将这些数据解析到 QMap<QString, QString> 中的步骤:
#include <QJsonDocument>
#include <QJsonObject>
#include <QMap>
#include <QDebug>
void parseJsonToMap() {
// JSON字符串
QString jsonString = R"(
{
"name": "John Doe",
"age": "30",
"email": "john.doe@example.com"
}
)";
// 将JSON字符串转换为QJsonDocument
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8());
// 准备一个QMap来存储解析的数据
QMap<QString, QString> dataMap;
// 解析JSON对象并填充QMap
if (!jsonDoc.isNull() && jsonDoc.isObject()) {
QJsonObject jsonObj = jsonDoc.object();
for (auto key : jsonObj.keys()) {
dataMap[key] = jsonObj.value(key).toString();
}
} else {
qDebug() << "Invalid JSON...";
}
// 打印QMap内容
for (auto key : dataMap.keys()) {
qDebug() << key << ":" << dataMap[key];
}
}
int main() {
parseJsonToMap();
return 0;
}
明
1. 从 JSON 字符串创建 QJsonDocument :使用 QJsonDocument::fromJson 来解析 JSON 字符串。
2. 创建 QMap :定义一个 QMap<QString, QString> 来存储键值对。
3. 遍历 JSON 对象 :使用 keys() 方法获取所有键,然后遍历这些键,将对应的值添加到 QMap 中。
4. 打印 QMap 内容 :遍历 QMap 并打印键值对。
这个示例展示了如何将 JSON 对象的键值对解析到 QMap 中。这种方法适用于键值对类型的简单 JSON 对象。对于更复杂的JSON 结构,可能需要更详细的解析逻辑

#include "widget.h"
#include "ui_widget.h"
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QDebug>
#include <QMessageBox>
#include <QJsonDocument>
#include <QByteArray>
#include <QFile>
#include <QJsonObject>
#include <QJsonArray>
#include <QPainter>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//窗体无状态栏
//setWindowFlag(Qt::FramelessWindowHint);
//界面跟随
this->setLayout(ui->verticalLayout);
//QMenu菜单组件
menuQuit = new QMenu(this);
//设置菜单项文字颜色
menuQuit->setStyleSheet("QMenu::item{color : red}");
//用户点击菜单项并点击后回调函数,推出程序
connect(menuQuit,&QMenu::triggered,[=](){
this->close();
});
//由QNetworkAccessManager发起get请求
mannager = new QNetworkAccessManager(this);
//QNetworkReply * get(const QNetworkRequest &request) QNetworkRequest(const QUrl &url = QUrl())
//strurl = "http://gfeljm.tianqiapi.com/api?unescape=1&version=v63&appid=76269866&appsecret=VRtxb7NZ";
strurl = "http://gfeljm.tianqiapi.com/api?unescape=1&version=v9&appid=76269866&appsecret=VRtxb7NZ";
QUrl urlNetId(strurl);
//指定请求url地址
QNetworkRequest request(urlNetId);
reply = mannager->get(request);
//QNetworkRequest网络请求后进行数据读取
connect(mannager,&QNetworkAccessManager::finished,this,&Widget::readHTTPSerial);
mWeekList << ui->label_day0 << ui->label_day1
<< ui->label_day2 << ui->label_day3
<< ui->label_day4 << ui->label_day5;
mDateList << ui->label_date0 << ui->label_date1
<< ui->label_date2 << ui->label_date3
<< ui->label_date4 << ui->label_date5;
mIconList <<ui->label_weaIcon0 <<ui->label_weaIcon1
<<ui->label_weaIcon2 <<ui->label_weaIcon3
<<ui->label_weaIcon4 <<ui->label_weaIcon5;
mWeaTypeList << ui->label_weaType0 << ui->label_weaType1
<< ui->label_weaType2 << ui->label_weaType3
<< ui->label_weaType4 << ui->label_weaType5;
mAirqList << ui->label_Airq0 << ui->label_Airq1
<< ui->label_Airq2 << ui->label_Airq3
<< ui->label_Airq4 << ui->label_Airq5;
mFxList << ui->label_Fx0 << ui->label_Fx1
<< ui->label_Fx2 << ui->label_Fx3
<< ui->label_Fx4 << ui->label_Fx5;
mFlList << ui->label_Fl0 << ui->label_Fl1
<< ui->label_Fl2 << ui->label_Fl3
<< ui->label_Fl4 << ui->label_Fl5;
//根据天气,设置icon的路径
mTypeMap.insert("暴雪",":/res/type/BaoXue.png");
mTypeMap.insert("暴雨",":/res/type/BaoYu. png");
mTypeMap.insert("暴雨到大暴雨",":/res/type/BaoYuDaoDaBaoYu.png");
mTypeMap.insert("大暴雨",":/res/type/DaBaoYu.png");
mTypeMap.insert("大暴雨到特大暴雨",":/res/type/DaBaoYuDaoTeDaBaoYu.png");
mTypeMap.insert("大到暴雪",":/res/type/DaDaoBaoXue.png");
mTypeMap.insert("大雪",":/res/type/DaXue.png");
mTypeMap.insert("大雨",":/res/type/DaYu.png");
mTypeMap.insert("冻雨",":/res/type/DongYu.png");
mTypeMap.insert("多云",":/res/type/DuoYun.png");
mTypeMap.insert("浮沉",":/res/type/FuChen.png");
mTypeMap.insert("雷阵雨",":/res/type/LeiZhenYu.png");
mTypeMap.insert("雷阵雨伴有冰雹",":/res/type/LeiZhenYuBanYouBingBao.png");
mTypeMap.insert("霾",":/res/type/Mai.png");
mTypeMap.insert("强沙尘暴",":/res/type/QiangShaChenBao.png");
mTypeMap.insert("晴",":/res/type/Qing.png");
mTypeMap.insert("沙尘暴",":/res/type/ShaChenBao.png");
mTypeMap.insert("特大暴雨",":/res/type/TeDaBaoYu.png");
mTypeMap.insert("undefined",":/res/type/undefined.png");
mTypeMap.insert("雾",":/res/type/Wu.png");
mTypeMap.insert("小到中雪",":/res/type/XiaoDaoZhongXue.png");
mTypeMap.insert("小到中雨",":/res/type/XiaoDaoZhongYu.png");
mTypeMap.insert("小雪",":/res/type/XiaoXue.png");
mTypeMap.insert("小雨",":/res/type/XiaoYu.png");
mTypeMap.insert("雪",":/res/type/Xue.png");
mTypeMap.insert("扬沙",":/res/type/YangSha.png");
mTypeMap.insert("阴",":/res/type/Yin.png");
mTypeMap.insert("雨",":/res/type/Yu.png");
mTypeMap.insert("雨夹雪",":/res/type/YuJiaXue.png");
mTypeMap.insert("阵雪",":/res/type/ZhenXue.png");
mTypeMap.insert("阵雨",":/res/type/ZhenYu.png");
mTypeMap.insert("中到大雪",":/res/type/ZhongDaoDaXue.png");
mTypeMap.insert("中到大雨",":/res/type/ZhongDaoDaYu.png");
mTypeMap.insert("中雪",":/res/type/ZhongXue.png");
mTypeMap.insert("中雨",":/res/type/ZhongYu.png");
ui->widget_07->installEventFilter(this);
ui->widget_08->installEventFilter(this);
}
Widget::~Widget()
{
delete ui;
}
/* 解析当天天气的Json文件 */
//void Widget::PaserWeatherFromJson(QByteArray rawData)
//{
// //获取天气,QByteArray转为QJsonDocument
// QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);
// //文本不为空且是键值表,QJsonDocument转为QJsonObject
// if(!jsonDoc.isNull() && jsonDoc.isObject()){
// QJsonObject jsonObj = jsonDoc.object();
// //日期
// ui->label_date0102->setText(jsonObj["date"].toString() +
// " " + jsonObj["week"].toString());
// //城市
// ui->label_city02->setText(jsonObj["city"].toString());
// //温度
// ui->label_temp02->setText(jsonObj["tem"].toString() + "℃");
// //天气
// ui->label_weather02->setText(jsonObj["wea"].toString());
// //天气图标
// ui->label_icon02->setPixmap(mTypeMap[jsonObj["wea"].toString()]);
// //温度范围
// ui->label_weatherdata02->setText(jsonObj["tem2"].toString() +
// "~" + jsonObj["tem1"].toString() + "℃");
// //感冒指数
// ui->label_text0301->setText(jsonObj["air_tips"].toString());
// //风向
// ui->label_FX->setText(jsonObj["win"].toString());
// //风速
// ui->label_FXdata->setText(jsonObj["win_speed"].toString());
// //湿度
// ui->label_SDdata->setText(jsonObj["humidity"].toString());
// //PM值
// ui->label_PMdata->setText(jsonObj["air_pm25"].toString());
// //空气质量
// ui->label_airQdata->setText(jsonObj["air_level"].toString());
// }
//}
/* 解析7天天气的Json文件 */
void Widget::PaserWeatherFromJsonNew(QByteArray rawData)
{
QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);
if(!jsonDoc.isNull() && jsonDoc.isObject()){
QJsonObject jsonRoot = jsonDoc.object();
days[0].mCity = jsonRoot["city"].toString();
days[0].mPM25 = jsonRoot["aqi"].toObject()["pm25"].toString();
qDebug() << days[0].mPM25;
if(jsonRoot.contains("data") && jsonRoot["data"].isArray()){
QJsonArray dataArray = jsonRoot["data"].toArray();
for (int i = 0; i < dataArray.size(); i++) {
QJsonObject jsonObj = dataArray[i].toObject();
days[i].mDate = jsonObj["date"].toString();
days[i].mWeek = jsonObj["week"].toString();
days[i].mTem = jsonObj["tem"].toString();
days[i].mWea = jsonObj["wea"].toString();
days[i].mTemLow = jsonObj["tem2"].toString();
days[i].mTemHigh = jsonObj["tem1"].toString();
days[i].mTips = jsonObj["air_tips"].toString();
days[i].mFx = jsonObj["win"].toArray()[0].toString();
days[i].mFl = jsonObj["win_speed"].toString();
days[i].mHumidity = jsonObj["humidity"].toString();
days[i].mAirq = jsonObj["air_level"].toString();
}
}
}
updateUI();
}
void Widget::updateUI()
{
QPixmap pixmap;
//日期
ui->label_date0102->setText(days[0].mDate + days[0].mWeek);
//城市
ui->label_city02->setText(days[0].mCity);
//温度
ui->label_temp02->setText(days[0].mTem + "℃");
//天气
ui->label_weather02->setText(days[0].mWea);
//天气图标
ui->label_icon02->setPixmap(mTypeMap[days[0].mWea]);
//温度范围
ui->label_weatherdata02->setText(days[0].mTemLow +
" ~ " + days[0].mTemHigh + "℃");
//感冒指数
ui->label_text0301->setText(days[0].mTips);
//风向
ui->label_FX->setText(days[0].mFx);
//风速
ui->label_FXdata->setText(days[0].mFl);
//湿度
ui->label_SDdata->setText(days[0].mHumidity);
//PM值
ui->label_PMdata->setText(days[0].mPM25);
//空气质量
ui->label_airQdata->setText(days[0].mAirq);
//遍历ui界面的label
for (int i = 0; i < 6; i++) {
//设置日期
mWeekList[i]->setText(days[i].mWeek);
mWeekList[0]->setText("今天");
mWeekList[1]->setText("明天");
mWeekList[2]->setText("后天");
//设置日期
QStringList dayList = days[i].mDate.split("-");
//只显示月日,不显示年,用-分隔开
mDateList[i]->setText(dayList.at(1)+"-"+dayList.at(2));
//设置图像
int indexpixMAp = days[i].mWea.indexOf("转");
//显示转的左边相符天气的图片
if(indexpixMAp != -1){
pixmap = mTypeMap[days[i].mWea.left(indexpixMAp)];
}
else {
pixmap = mTypeMap[days[i].mWea];
}
//设置图片的样式scaled
pixmap = pixmap.scaled(mIconList[i]->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);
//设置图片的宽度与高度
mIconList[i]->setMaximumWidth(ui->widget_05->width()/6.5);
mIconList[i]->setMaximumHeight(50);
mIconList[i]->setPixmap(pixmap);
//设置天气类型
mWeaTypeList[i]->setText(days[i].mWea);
//设置天气质量
QString daysAirq = days[i].mAirq;
mAirqList[i]->setText(daysAirq);
if(daysAirq == "优"){
//设置背景
mAirqList[i]->setStyleSheet("background-color: rgb(86, 223, 48);color: rgb(255, 255, 255);border-radius:7px;");
}
if(daysAirq == "良"){
mAirqList[i]->setStyleSheet("background-color: rgb(255, 184, 70);color: rgb(255, 255, 255);border-radius:7px;");
}
if(daysAirq == "轻度"){
mAirqList[i]->setStyleSheet("background-color: rgb(245, 223, 48);color: rgb(255, 255, 255);border-radius:7px;");
}
if(daysAirq == "中度"){
mAirqList[i]->setStyleSheet("background-color: rgb(245, 82, 84);color: rgb(255, 255, 255);border-radius:7px;");
}
if(daysAirq == "中度"){
mAirqList[i]->setStyleSheet("background-color: rgb(255, 0, 0);color: rgb(255, 255, 255);border-radius:7px;");
}
//设置风向
mFxList[i]->setText(days[i].mFx);
//设置风力
int indexFl = days[i].mFl.indexOf("转");
//显示转的左边相符天气的风力
if(indexFl != -1){
mFlList[i]->setText(days[i].mFl.left(indexFl));
}
else {
mFlList[i]->setText(days[i].mFl);
}
}
//更新显示
update();
}
/* 获取天气的Json文件 */
void Widget::readHTTPSerial(QNetworkReply *reply)
{
//http协议的状态码
int state_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
//无错误却状态码等于200,获取天气的数据
if(reply->error() == QNetworkReply::NoError && state_code == 200){
//大多数服务器返回的字符编码格式是utf-8
QByteArray data = reply->readAll();
//PaserWeatherFromJson(data);
PaserWeatherFromJsonNew(data);
//调试
//qDebug() << QString::fromUtf8( data);
}
else {
//生成一个提示窗口
QMessageBox msgBox;
msgBox.setWindowTitle("错误");
msgBox.setText("网络连接错误");
msgBox.setStandardButtons(QMessageBox::Ok);
msgBox.exec();
//调试
reply->errorString();
}
}
/* 鼠标按下触发事件 */
void Widget::mousePressEvent(QMouseEvent *event)
{
//鼠标右键按下
if(event->button() == Qt::RightButton){
//qDebug() << "Rigght button clicked!";
//显示推出窗口
menuQuit->addAction(QIcon(":/res/close.png"),"退出");
//窗口出现在鼠标的位置
menuQuit->exec(QCursor::pos());
}
//鼠标左键按下
if(event->button() == Qt::LeftButton){
//qDebug() << "Left button clicked!";
//获取鼠标的位置,界面左上角的位置
//qDebug() << event->globalPos() << this->pos();
//偏移量:鼠标位置与界面左上角的位置的差
mOffset = event->globalPos() - this->pos();
}
}
/* 鼠标拖动移动界面 */
void Widget::mouseMoveEvent(QMouseEvent *event)
{
//减去偏移量会更湿滑,不然鼠标会跑到界面左上角的位置
this->move(event->globalPos() - mOffset);
}
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
if(watched == ui->widget_07 && event->type() == QEvent::Paint){
drawTempHigh();
}
if(watched == ui->widget_08 && event->type() == QEvent::Paint){
drawTempLow();
}
return QWidget::eventFilter(watched,event);
}
void Widget::drawTempHigh()
{
QPainter painter(ui->widget_07);
painter.setRenderHint(QPainter::Antialiasing,true);
painter.setBrush(QBrush(QColor(255, 126, 52)));
painter.setPen(QColor(255, 126, 52));
int t_ave;
int sum = 0;
int offset = 0;
int middle = ui->widget_07->height()/2;
for (int i = 0; i < 6; i++) {
sum += days[i].mTemHigh.toUInt();
}
t_ave = sum / 6;
//定义出6个点
QPoint points[6];
for (int i = 0; i < 6; i++) {
points[i].setX(mAirqList[i]->x() + mAirqList[i]->width()/2);
offset = (days[i].mTemHigh.toInt() - t_ave)*3;
points[i].setY(middle - offset);
//画点
painter.drawEllipse(QPoint(points[i]),3,3);
//画实际温度
painter.drawText(points[i].x()-5,points[i].y()+25,days[i].mTemHigh + "°");
}
//画5根线
for (int i = 0; i < 5; i++) {
painter.drawLine(points[i],points[i+1]);
}
}
void Widget::drawTempLow()
{
QPainter painter(ui->widget_08);
painter.setRenderHint(QPainter::Antialiasing,true);
painter.setBrush(QBrush(QColor(53, 168, 193)));
painter.setPen(QColor(53, 168, 193));
int t_ave;
int sum = 0;
int offset = 0;
int middle = ui->widget_08->height()/2;
for (int i = 0; i < 6; i++) {
sum += days[i].mTemLow.toUInt();
}
t_ave = sum / 6;
//定义出6个点
QPoint points[6];
for (int i = 0; i < 6; i++) {
points[i].setX(mAirqList[i]->x() + mAirqList[i]->width()/2);
offset = (days[i].mTemLow.toInt() - t_ave)*3;
points[i].setY(middle - offset);
//画点
painter.drawEllipse(QPoint(points[i]),3,3);
//画实际温度
painter.drawText(points[i].x()-5,points[i].y()+25,days[i].mTemLow + "°");
}
//画5根线
for (int i = 0; i < 5; i++) {
painter.drawLine(points[i],points[i+1]);
}
}
/*
解析:/citycode.json文件的cityid与cityname,获取不同城市的天气
QString getCityCodeFromName(QString name)
{
//打开文件,获取城市的名字,id
QFile file(":/citycode.json");
file.open(QIODevice::ReadOnly);
QByteArray rawData = file.readAll();
file.close();
//把文件QByteArray转成QJsonDocument
QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);
//判断是不是数组,QJsonDocument转为QJsonArray
if(jsonDoc.isArray()){
QJsonArray citys = jsonDoc.array();
//遍寻数组,用QJsonValue遍寻
for(QJsonValue value:citys){
//判断数组是不是QJsonObject,将QJsonArray转为QJsonObject
if(value.isObject()){
QJsonObject cityName = value.toObject();
//获取城市名字
QString cityname = cityName["city_name"].toString();
//判断该城市名是否与文本一致,是返回城市id
if(cityname == name){
return cityName["city_code"].toString();
}
}
}
//遍寻未找到该城市,返回空字符
return "";
}
}
*/
/* 按键触发 */
void Widget::on_pushButton_clicked()
{
//读取文本的城市名称
QString cityName = ui->lineEdit_ReaserchCity->text();
//返回的值城市id
QString cityCode = citycodeutils.getCityCodeFromName(cityName);
//如果有返回值,重新获取该地区的天气
if(cityCode != NULL){
strurl += "&cityid=" + cityCode;
mannager->get(QNetworkRequest(QUrl(strurl)));
}
//如果返回空字符,显示一个错误提示
else{
QMessageBox msgBox;
msgBox.setWindowTitle("错误");
msgBox.setText("请输入正确的城市名称");
msgBox.setStandardButtons(QMessageBox::Ok);
msgBox.exec();
}
}
/* 回车确认按键 */
void Widget::on_lineEdit_ReaserchCity_returnPressed()
{
on_pushButton_clicked();
}