当前位置: 首页 > news >正文

Qt项目天气预报(4) - json 数据解析

  QT的json基本概念

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它易于人阅读和编写,同时也易于机器解析和生成。JSON是基于JavaScript的一个子集,尽管它是独立于语言的,且有多种语言支持。JSON常用于网络应用程序中的数据传输,尤其是在Web应用程序中与后端服务器通信。

在Qt中生成JSON数据并将其保存到文件的一个基本示例涉及使用 QJsonDocument QJsonObject QJsonArray 类。以下是创建一个简单JSON对象并将其保存到文件的示例代码。

Qt 输出生成json文件

widget.cpp

#include "widget.h"
#include "ui_widget.h"#include <QFile>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QJsonObject rootObj;//配置简单的json数据:rootObj["cityid"] = "101050101";rootObj["date"] = "2024-06-16";rootObj["week"] = "星期日";rootObj["tmp"] = "255";//创建并实例化json数组QJsonArray jsonArray;jsonArray.append("data1");jsonArray.append("data2");jsonArray.append("data3");jsonArray.append(100);//将json组作为一组值对象,赋值给一个键rootObj["testArry"] = jsonArray;//QJsonObject 对象也能加入数组QJsonObject alarmObj;alarmObj["alarmType"] = "雪灾";alarmObj["alarmLeve"] = "黄色";alarmObj["alarmTitle"] = "哈尔滨雪灾险情,请注意安全";rootObj["alarm"] = alarmObj;//多层数组嵌套QJsonObject day0;day0["day"] = "星期一";day0["wea"] = "晴";day0["tem"] = 20;QJsonObject day1;day1["day"] = "星期二";day1["wea"] = "阴";day1["tem"] = 12;QJsonObject day2;day2["day"] = "星期三";day2["wea"] = "雨";day2["tem"] = 9;QJsonArray dayArray;dayArray.append(day0);dayArray.append(day1);dayArray.append(day2);rootObj["days"] = dayArray;// 通过QJsonDocument类把JSON类型的数据转为QByteArrayQJsonDocument jsonDoc(rootObj);QByteArray jsonArry =  jsonDoc.toJson();QFile file("F:/myqt/file_of_qt/test.json");file.open(QIODevice::WriteOnly);file.write(jsonArry); // 将QByteArray中的数据写入中文件file.close();}Widget::~Widget()
{delete ui;
}

效果演示

解析json数据

widget.cpp

#include "widget.h"
#include "ui_widget.h"#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>
#include <QJsonArray>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 读取JSON文件保存到QByteArray中QFile file("F:/myqt/file_of_qt/test.json");file.open(QIODevice::ReadOnly);QByteArray rawData = file.readAll(); // 将QByteArray中的数据写入中文件file.close();// 成绩单JsonObeject对象, 通过下标(键匹配)访问解析,解析出json文件数据QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);if(!jsonDoc.isNull() && jsonDoc.isObject()){QJsonObject jsonRoot = jsonDoc.object();QString strW =jsonRoot["week"].toString();QString strT =jsonRoot["tmp"].toString();QString strDA =jsonRoot["date"].toString();QString strCT =jsonRoot["cityid"].toString();qDebug()<<strW;qDebug()<<strT; //这里tmp定义的数字是QString类型//qDebug()<<QString::number(strT); //qDebug() 默认输出QString类型需要转化qDebug()<<strCT;qDebug()<<strDA;// 解析QJsonArrayif(jsonRoot.contains("testArry") && jsonRoot["testArry"].isArray()){qDebug()<<"arry";QJsonArray testArry = jsonRoot["testArry"].toArray();for(QJsonValue val : testArry){// 根据类型进行转换switch (val.type()) {case QJsonValue::Double:qDebug()<<QString::number(val.toDouble());break;case QJsonValue::String:qDebug()<<val.toString();break;case QJsonValue::Object:break;}}}//解析QJsonObeject对象if(jsonRoot.contains("alarm") && jsonRoot["alarm"].isObject()){QJsonObject alarmObj = jsonRoot["alarm"].toObject();qDebug()<< alarmObj["alarmLeve"].toString();qDebug()<< alarmObj["alarmTitle"].toString();qDebug()<< alarmObj["alarmType"].toString();}//解析包含QJsonObject对象的 QJsonArrayif(jsonRoot.contains("days") && jsonRoot["days"].isArray()){QJsonArray dataArray = jsonRoot["days"].toArray();for(QJsonValue val:dataArray){//if(val.type() == QJsonValue::Object){if(val.isObject()){QJsonObject obj = val.toObject();qDebug()<<obj["day"].toString();qDebug()<<QString::number(obj["tem"].toDouble());qDebug()<<obj["wea"].toString();}}}}}Widget::~Widget()
{delete ui;
}

效果演示

如上图所有的json数据我们都已经解析出来了

相关文章:

  • 可灵王炸更新,图生视频、视频续写,最长可达3分钟!Runway 不香了 ...
  • 【FreeRTOS】删除任务 用遥控器控制音乐
  • Linux中的TCP与UDP:理解两者的差异
  • 生活实用口语柯桥成人外语培训机构“客服”用英文怎么说?
  • 服务器SSH 免密码登录
  • 计算机网络(概述)
  • nginx的rev->handler的更新历程
  • 8.12 矢量图层面要素单一符号使用五(栅格数据填充)
  • 用自己的数据集训练TimeSformer并转ONNX用c++推理
  • 2024广东省职业技能大赛云计算赛项实战——容器云平台搭建
  • python watchdog 配置文件热更新
  • BP神经网络的反向传播(Back Propagation)
  • 方法区讲解
  • EasyExcel 导出批注信息
  • 【Go】十四、图形验证码、短信验证码、注册接口与redis的简单使用
  • hexo+github搭建个人博客
  • 2017届校招提前批面试回顾
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JavaScript 一些 DOM 的知识点
  • Linux链接文件
  • nfs客户端进程变D,延伸linux的lock
  • PHP的类修饰符与访问修饰符
  • Shell编程
  • SpringCloud集成分布式事务LCN (一)
  • ⭐ Unity + OpenCV 实现实时图像识别与叠加效果
  • vue-cli在webpack的配置文件探究
  • 基于webpack 的 vue 多页架构
  • 前端相关框架总和
  • 时间复杂度与空间复杂度分析
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 算法-图和图算法
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • puppet连载22:define用法
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • $.proxy和$.extend
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (Note)C++中的继承方式
  • (备份) esp32 GPIO
  • (笔试题)合法字符串
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)计算机毕业设计高校学生选课系统
  • (蓝桥杯每日一题)love
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (七)glDrawArry绘制
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)VC++中ondraw在什么时候调用的
  • ***详解账号泄露:全球约1亿用户已泄露
  • .net 4.0发布后不能正常显示图片问题
  • .Net Core 中间件与过滤器
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET 漏洞分析 | 某ERP系统存在SQL注入