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();
}