kylin-weather/model/dataparser.cpp

538 lines
23 KiB
C++

#include "dataparser.h"
DataParser::DataParser() {}
void DataParser::dataAnalysis(QByteArray dataBa)
{
qDebug() << " ##### Function Positioning ##### 处理返回的网络数据 ##### " <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
//数据异常
QJsonParseError jsonParserErr;
QJsonDocument jsonDocument = QJsonDocument::fromJson(dataBa, &jsonParserErr);
if (jsonParserErr.error != QJsonParseError::NoError) { // Json type error
ErrorReact::getInstance()->dataFeedBack(false, jsonParserErr.errorString());
return;
}
if (jsonDocument.isNull() || jsonDocument.isEmpty()) {
ErrorReact::getInstance()->dataFeedBack(false, "Json null or empty!");
return;
}
// jsonObject数据为空
QJsonObject jsonObject = jsonDocument.object();
if (jsonObject.isEmpty() || jsonObject.size() == 0) {
ErrorReact::getInstance()->dataFeedBack(false, "Json object null or empty!");
return;
}
//无KylinWeather
if (!jsonObject.contains("KylinWeather")) {
// ErrorReact::getInstance()->dataFeedBack(false,"服务器数据没有字段");
ErrorReact::getInstance()->dataFeedBack(false, tr("Data is empty"));
return;
}
QJsonObject mainObj = jsonObject.value("KylinWeather").toObject();
if (mainObj.isEmpty() || mainObj.size() == 0) {
ErrorReact::getInstance()->dataFeedBack(false, "Json object null or empty!");
return;
}
//解析当前城市天气状况和一周预报天气
if (mainObj.contains("weather")) {
QJsonObject weatherObj = mainObj.value("weather").toObject();
if (!weatherObj.isEmpty() && weatherObj.size() > 0) {
m_currentWeather = currentWeather(weatherObj);
forcastWeather(weatherObj, m_currentWeather);
}
} else {
success = false;
}
//解析生活指数信息
if (mainObj.contains("lifestyle")) {
QJsonObject lifestyleObj = mainObj.value("lifestyle").toObject();
lifeStyle(lifestyleObj);
}
// QJsonObject hourlyObj = mainObj.value("hourly").toObject();
// QList<Hourly>hourlist;
// tmphourlyWeather(hourlyObj,hourlist);
//解析逐小时天气信息
if (mainObj.contains("hourly")) {
QJsonObject hourlyObj = mainObj.value("hourly").toObject();
hourlist = hourlyWeather(hourlyObj);
} else {
success = false;
}
}
//处理返回的网络数据
void DataParser::dataReply(QByteArray dataBa)
{
dataAnalysis(dataBa);
if (success){
emit showCurrent(m_currentWeather);
QVariant var;
var.setValue<QList<Hourly>>(hourlist);
emit showHourly(var);
//将当前城市信息存入配置文件
if (hourlist.length() > 0) {
QStringList serveTimeList = m_currentWeather.serveTime.split(' ');
if (hourlist.first().time.length() > 1 && serveTimeList.length() > 0) {
m_currentWeather.serveTime = serveTimeList.first() + " " + hourlist.first().time.mid(0);
}
}
setGsettings(m_currentWeather);
} else {
ErrorReact::getInstance()->dataFeedBack(false, tr("Data is empty"));
}
}
void DataParser::dataReplyL(QByteArray dataBa)
{
dataAnalysis(dataBa);
if (success){
emit showLeftCity(m_currentWeather);
} else {
ErrorReact::getInstance()->dataFeedBack(false, tr("Data is empty"));
}
return;
}
void DataParser::dataReplyR(QByteArray dataBa)
{
dataAnalysis(dataBa);
if (success){
emit showRightCity(m_currentWeather);
} else {
ErrorReact::getInstance()->dataFeedBack(false, tr("Data is empty"));
}
return;
}
void DataParser::dataReplyLAndR(QByteArray dataBa)
{
QJsonParseError jsonParserErr;
QJsonDocument jsonDocument = QJsonDocument::fromJson(dataBa, &jsonParserErr);
if (jsonParserErr.error != QJsonParseError::NoError) { // Json type error
ErrorReact::getInstance()->dataFeedBack(false, jsonParserErr.errorString());
return;
}
if (jsonDocument.isNull() || jsonDocument.isEmpty()) {
ErrorReact::getInstance()->dataFeedBack(false, "Json null or empty!");
return;
}
QJsonObject jsonObject = jsonDocument.object();
if (jsonObject.isEmpty() || jsonObject.size() == 0) {
ErrorReact::getInstance()->dataFeedBack(false, "Json object null or empty!");
return;
}
if (jsonObject.contains("KylinWeather")) {
QJsonObject mainObj = jsonObject.value("KylinWeather").toObject();
if (mainObj.isEmpty() || mainObj.size() == 0) {
return;
}
if (mainObj.contains("weather")) {
QString weather_msg = mainObj.value("weather").toString();
if (weather_msg != "") {
lAndRWeather(weather_msg);
}
}
}
return;
}
void DataParser::lAndRWeather(QString weatherList)
{
QList<CurrentWeather> citysWeatherList;
if (weatherList == "")
return;
QStringList strList = weatherList.split(";");
QString weatherStr = "";
for (int i = 0; i <= strList.length() - 1; i++) {
weatherStr = strList.at(i);
CurrentWeather cityWeather;
if (!weatherStr.isEmpty() && weatherStr.contains(",", Qt::CaseInsensitive)) {
QJsonObject m_json;
if (!weatherStr.isEmpty()) {
QStringList eachKeyList = weatherStr.split(",");
foreach (QString strKey, eachKeyList) {
if (!strKey.isEmpty()) {
//等号左边为键,右边为值
m_json.insert(strKey.split("=").at(0), strKey.split("=").at(1));
}
}
}
cityWeather.id = m_json.value("id").toString();
cityWeather.city = m_json.value("location").toString();
cityWeather.tmp = m_json.value("tmp").toString();
cityWeather.cond_code = m_json.value("cond_code").toString();
cityWeather.cond_txt = m_json.value("cond_txt").toString();
cityWeather.wind_dir = m_json.value("wind_dir").toString();
cityWeather.wind_sc = m_json.value("wind_sc").toString();
cityWeather.hum = m_json.value("hum").toString();
} else {
cityWeather.id = "N/A";
cityWeather.tmp = "N/A";
cityWeather.city = "N/A";
cityWeather.cond_code = "999";
cityWeather.cond_txt = "N/A";
cityWeather.wind_dir = "N/A";
cityWeather.wind_sc = "N/A";
cityWeather.hum = "N/A";
//返回的数据中带了一个空数据,所以将这一项去掉
if (i != strList.length() - 1) {
ErrorReact::getInstance()->dataFeedBack(false, tr("Data is empty"));
}
}
citysWeatherList.append(cityWeather);
}
emit showLAndRCode(citysWeatherList);
return;
}
void DataParser::dataReplyColl(QByteArray dataBa)
{
QJsonParseError jsonParserErr;
QJsonDocument jsonDocument = QJsonDocument::fromJson(dataBa, &jsonParserErr);
if (jsonParserErr.error != QJsonParseError::NoError) { // Json type error
ErrorReact::getInstance()->dataFeedBack(false, jsonParserErr.errorString());
return;
}
if (jsonDocument.isNull() || jsonDocument.isEmpty()) {
ErrorReact::getInstance()->dataFeedBack(false, "Json null or empty!");
return;
}
QJsonObject jsonObject = jsonDocument.object();
if (jsonObject.isEmpty() || jsonObject.size() == 0) {
ErrorReact::getInstance()->dataFeedBack(false, "Json object null or empty!");
return;
}
if (jsonObject.contains("KylinWeather")) {
QJsonObject mainObj = jsonObject.value("KylinWeather").toObject();
if (mainObj.isEmpty() || mainObj.size() == 0) {
return;
}
if (mainObj.contains("weather")) {
QString weather_msg = mainObj.value("weather").toString();
if (weather_msg != "") {
collectWeather(weather_msg);
}
}
}
}
//解析生活指数信息
void DataParser::lifeStyle(QJsonObject lifestyleObj)
{
LifeStyle m_lifestyle;
if (!lifestyleObj.isEmpty() && lifestyleObj.size() > 0) {
m_lifestyle.air_brf = lifestyleObj.value("air_brf").toString();
m_lifestyle.cw_brf = lifestyleObj.value("cw_brf").toString();
m_lifestyle.drsg_brf = lifestyleObj.value("drsg_brf").toString();
m_lifestyle.flu_brf = lifestyleObj.value("flu_brf").toString();
m_lifestyle.sport_brf = lifestyleObj.value("sport_brf").toString();
m_lifestyle.uv_brf = lifestyleObj.value("uv_brf").toString();
} else {
m_lifestyle.air_brf = "N/A";
m_lifestyle.cw_brf = "N/A";
m_lifestyle.drsg_brf = "N/A";
m_lifestyle.flu_brf = "N/A";
m_lifestyle.sport_brf = "N/A";
m_lifestyle.uv_brf = "N/A";
// ErrorReact::getInstance()->dataFeedBack(false,"服务器返回数据为空或不全");
ErrorReact::getInstance()->dataFeedBack(false, tr("Data is empty"));
}
emit showLifeStyle(m_lifestyle);
}
//解析当前城市信息
CurrentWeather DataParser::currentWeather(QJsonObject weatherObj)
{
CurrentWeather currentWeather;
qDebug() << " ##### Function Positioning ##### 解析当前城市信息 ##### " <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
//当前城市id
QString id_msg = weatherObj.value("id").toString();
if (id_msg != "") {
currentWeather.id = id_msg;
}
//当前城市名字
QString location_msg = weatherObj.value("location").toString();
if (location_msg != "") {
currentWeather.city = location_msg;
}
//当前城市需要显示的具体信息
QString now_msg = weatherObj.value("now").toString();
if (now_msg != "" && now_msg.contains(",", Qt::CaseInsensitive)) {
QStringList strList = now_msg.split(",");
QJsonObject m_json;
foreach (QString str, strList) {
if (str != "") {
m_json.insert(str.split("=").at(0), str.split("=").at(1));
}
}
currentWeather.tmp = m_json.value("tmp").toString();
currentWeather.wind_sc = m_json.value("wind_sc").toString();
currentWeather.cond_txt = m_json.value("cond_txt").toString();
currentWeather.hum = m_json.value("hum").toString();
currentWeather.cond_code = m_json.value("cond_code").toString();
currentWeather.wind_dir = m_json.value("wind_dir").toString();
currentWeather.serveTime = weatherObj.value("update_time").toString();
qDebug() << " ##### Function Positioning ##### 解析当前城市信息 ##### " <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
} else {
currentWeather.tmp = "N/A";
currentWeather.wind_sc = "N/A";
currentWeather.cond_txt = "N/A";
currentWeather.hum = "N/A";
currentWeather.cond_code = "999";
currentWeather.wind_dir = "N/A";
currentWeather.serveTime = "N/A";
// ErrorReact::getInstance()->dataFeedBack(false,"服务器返回数据为空或不全");
ErrorReact::getInstance()->dataFeedBack(false, tr("Data is empty"));
qDebug() << " ##### Function Positioning ##### 解析当前城市信息 ##### " <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
}
return currentWeather;
}
//解析预报天气信息
void DataParser::forcastWeather(QJsonObject weatherObj, CurrentWeather currentWeather)
{
ForecastWeather forecastWeather;
QStringList strList;
int i = 0;
//处理预报天气
QString forecast_msg = weatherObj.value("forecast").toString();
if (forecast_msg != "" && forecast_msg.contains(",", Qt::CaseInsensitive)) {
strList = forecast_msg.split(";");
foreach (QString strDay, strList) {
QStringList strListDaySub;
QJsonObject m_json;
if (strDay != "") {
strListDaySub = strDay.split(",");
foreach (QString str, strListDaySub) {
if (str != "") {
m_json.insert(str.split("=").at(0), str.split("=").at(1));
}
}
QString dateTime = currentWeather.serveTime.split(" ").first();
setCollectValue(i, m_json, forecastWeather, dateTime);
i++;
}
}
} else {
// ErrorReact::getInstance()->dataFeedBack(false,"服务器返回数据为空或不全");
ErrorReact::getInstance()->dataFeedBack(false, tr("Data is empty"));
}
emit showForcast(forecastWeather);
}
void DataParser::setGsettings(CurrentWeather currentWeather)
{
//存配置文件
QString weatherNow = "";
weatherNow.append(currentWeather.serveTime + ","); //时间
weatherNow.append(currentWeather.id + ","); //省市编码
weatherNow.append(currentWeather.city + ","); //城市名称
weatherNow.append(currentWeather.cond_txt + ","); //天气情况
weatherNow.append(currentWeather.hum + "%,"); //湿度
weatherNow.append(currentWeather.tmp + "°,"); //温度
weatherNow.append(currentWeather.wind_dir + ","); //风向
weatherNow.append(currentWeather.wind_sc + "级,"); //风力
// weatherNow.append(weatherObj.value("admin_area").toString()+",");//省份----暂时不需要
weatherNow.append(currentWeather.cond_code + ",");
CoreVar::setSettings("weather", weatherNow); //写入配置文件
}
void DataParser::collectWeather(QString weatherList)
{
QList<CollectItemData> collectItemList;
if (weatherList == "")
return;
QStringList strList = weatherList.split(";");
QString weatherStr = "";
for (int i = 0; i <= strList.length() - 1; i++) {
weatherStr = strList.at(i);
CollectItemData collectItemData;
if (!weatherStr.isEmpty() && weatherStr.contains(",", Qt::CaseInsensitive)) {
QJsonObject m_json;
if (!weatherStr.isEmpty()) {
QStringList eachKeyList = weatherStr.split(",");
foreach (QString strKey, eachKeyList) {
if (!strKey.isEmpty()) {
//等号左边为键,右边为值
m_json.insert(strKey.split("=").at(0), strKey.split("=").at(1));
}
}
}
collectItemData.tmp = m_json.value("tmp").toString() + QString("°");
collectItemData.cond_code = m_json.value("cond_code").toString();
collectItemData.cityId = m_json.value("id").toString();
collectItemData.cityName = m_json.value("location").toString();
} else {
collectItemData.tmp = "-";
collectItemData.cond_code = "999";
collectItemData.cityId = "-";
collectItemData.cityName = "-";
// ErrorReact::getInstance()->dataFeedBack(false,"服务器返回数据为空或不全");
//返回的数据中带了一个空数据,所以将这一项去掉
if (i != strList.length() - 1) {
ErrorReact::getInstance()->dataFeedBack(false, tr("Data is empty"));
}
}
collectItemList.append(collectItemData);
}
emit showCollectCode(collectItemList);
}
QList<Hourly> DataParser::hourlyWeather(QJsonObject hourlyObj)
{
QList<Hourly> hourlist;
if (hourlyObj.contains(QStringLiteral("hourly"))) {
QJsonValue arrayValue = hourlyObj.value(QStringLiteral("hourly"));
if (arrayValue.isArray()) {
QJsonArray array = arrayValue.toArray();
if (array.size() != 24) {
ErrorReact::getInstance()->dataFeedBack(false, tr("hourly != 24"));
return hourlist;
}
for (int i = 0; i < array.size(); i++) {
QJsonValue jsonArray = array.at(i);
QJsonObject m_json = jsonArray.toObject();
Hourly tmp_hour;
if (!(m_json.contains("icon") && m_json.contains("fxTime") && m_json.contains("temp"))) {
ErrorReact::getInstance()->dataFeedBack(false, tr("hourly key is wrong"));
return hourlist;
}
if (m_json.value("icon").toString() == "" || m_json.value("fxTime").toString() == ""
|| m_json.value("temp").toString() == "") {
tmp_hour.cond_code = "999";
tmp_hour.time = "-";
tmp_hour.tmp = "-";
} else {
tmp_hour.cond_code = m_json.value("icon").toString();
// tmp_hour.cond_txt = m_json.value("text").toString();
tmp_hour.time = m_json.value("fxTime").toString();
QString timeFormat = tmp_hour.time.mid(tmp_hour.time.indexOf("T"), 6);
timeFormat = timeFormat.replace("T", "");
tmp_hour.time = timeFormat;
tmp_hour.tmp = m_json.value("temp").toString() + QString("°");
}
hourlist.append(tmp_hour);
}
}
}
return hourlist;
}
//临时用
void DataParser::tmphourlyWeather(QJsonObject hourlyObj, QList<Hourly> hourlist)
{
QTime current_time = QTime::currentTime();
int hour = current_time.hour() + 1; //当前的小时
for (int i = 0; i < 24; i++) {
int num_code = qrand() % (1, 60);
int num_tmp = qrand() % (-10, 30);
QString tmpText = QString::number(num_tmp) + "°C";
Hourly tmp_hour;
QString hour_tmp = QString::number(hour + i) + ":00";
if (hour + i >= 24) {
hour_tmp = QString::number(hour + i - 24) + ":00";
if (hour + i - 24 < 10) {
hour_tmp = "0" + QString::number(hour + i - 24) + ":00";
}
}
tmp_hour.cond_code = CoreVar::WEATHER_CODE_TMP.at(num_code);
tmp_hour.time = hour_tmp;
tmp_hour.tmp = tmpText;
hourlist.append(tmp_hour);
}
QVariant var;
var.setValue<QList<Hourly>>(hourlist);
emit showHourly(var);
}
void DataParser::setCollectValue(int i, const QJsonObject &json, ForecastWeather &forecastweather,
const QString &dateTime)
{
switch (i) {
case 0:
forecastweather.first.cond_txt_d = json.value("cond_txt_d").toString();
forecastweather.first.cond_txt_n = json.value("cond_txt_n").toString();
forecastweather.first.cond_code_d = json.value("cond_code_d").toString();
forecastweather.first.cond_code_n = json.value("cond_code_n").toString();
forecastweather.first.wind_dir = json.value("wind_dir").toString();
forecastweather.first.wind_sc = json.value("wind_sc").toString();
forecastweather.first.tmp_max = json.value("tmp_max").toString();
forecastweather.first.tmp_min = json.value("tmp_min").toString();
forecastweather.first.date = json.value("date").toString();
forecastweather.first.dateTime = dateTime;
case 1:
forecastweather.second.cond_txt_d = json.value("cond_txt_d").toString();
forecastweather.second.cond_txt_n = json.value("cond_txt_n").toString();
forecastweather.second.cond_code_d = json.value("cond_code_d").toString();
forecastweather.second.cond_code_n = json.value("cond_code_n").toString();
forecastweather.second.wind_dir = json.value("wind_dir").toString();
forecastweather.second.wind_sc = json.value("wind_sc").toString();
forecastweather.second.tmp_max = json.value("tmp_max").toString();
forecastweather.second.tmp_min = json.value("tmp_min").toString();
forecastweather.second.date = json.value("date").toString();
forecastweather.second.dateTime = dateTime;
case 2:
forecastweather.third.cond_txt_d = json.value("cond_txt_d").toString();
forecastweather.third.cond_txt_n = json.value("cond_txt_n").toString();
forecastweather.third.cond_code_d = json.value("cond_code_d").toString();
forecastweather.third.cond_code_n = json.value("cond_code_n").toString();
forecastweather.third.wind_dir = json.value("wind_dir").toString();
forecastweather.third.wind_sc = json.value("wind_sc").toString();
forecastweather.third.tmp_max = json.value("tmp_max").toString();
forecastweather.third.tmp_min = json.value("tmp_min").toString();
forecastweather.third.date = json.value("date").toString();
forecastweather.third.dateTime = dateTime;
case 3:
forecastweather.fourth.cond_txt_d = json.value("cond_txt_d").toString();
forecastweather.fourth.cond_txt_n = json.value("cond_txt_n").toString();
forecastweather.fourth.cond_code_d = json.value("cond_code_d").toString();
forecastweather.fourth.cond_code_n = json.value("cond_code_n").toString();
forecastweather.fourth.wind_dir = json.value("wind_dir").toString();
forecastweather.fourth.wind_sc = json.value("wind_sc").toString();
forecastweather.fourth.tmp_max = json.value("tmp_max").toString();
forecastweather.fourth.tmp_min = json.value("tmp_min").toString();
forecastweather.fourth.date = json.value("date").toString();
forecastweather.fourth.dateTime = dateTime;
case 4:
forecastweather.fifth.cond_txt_d = json.value("cond_txt_d").toString();
forecastweather.fifth.cond_txt_n = json.value("cond_txt_n").toString();
forecastweather.fifth.cond_code_d = json.value("cond_code_d").toString();
forecastweather.fifth.cond_code_n = json.value("cond_code_n").toString();
forecastweather.fifth.wind_dir = json.value("wind_dir").toString();
forecastweather.fifth.wind_sc = json.value("wind_sc").toString();
forecastweather.fifth.tmp_max = json.value("tmp_max").toString();
forecastweather.fifth.tmp_min = json.value("tmp_min").toString();
forecastweather.fifth.date = json.value("date").toString();
forecastweather.fifth.dateTime = dateTime;
case 5:
forecastweather.sixth.cond_txt_d = json.value("cond_txt_d").toString();
forecastweather.sixth.cond_txt_n = json.value("cond_txt_n").toString();
forecastweather.sixth.cond_code_d = json.value("cond_code_d").toString();
forecastweather.sixth.cond_code_n = json.value("cond_code_n").toString();
forecastweather.sixth.wind_dir = json.value("wind_dir").toString();
forecastweather.sixth.wind_sc = json.value("wind_sc").toString();
forecastweather.sixth.tmp_max = json.value("tmp_max").toString();
forecastweather.sixth.tmp_min = json.value("tmp_min").toString();
forecastweather.sixth.date = json.value("date").toString();
forecastweather.sixth.dateTime = dateTime;
case 6:
forecastweather.seventh.cond_txt_d = json.value("cond_txt_d").toString();
forecastweather.seventh.cond_txt_n = json.value("cond_txt_n").toString();
forecastweather.seventh.cond_code_d = json.value("cond_code_d").toString();
forecastweather.seventh.cond_code_n = json.value("cond_code_n").toString();
forecastweather.seventh.wind_dir = json.value("wind_dir").toString();
forecastweather.seventh.wind_sc = json.value("wind_sc").toString();
forecastweather.seventh.tmp_max = json.value("tmp_max").toString();
forecastweather.seventh.tmp_min = json.value("tmp_min").toString();
forecastweather.seventh.date = json.value("date").toString();
forecastweather.seventh.dateTime = dateTime;
break;
default:
break;
}
}