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类型的数据转为QByteArray
QJsonDocument 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;
// 解析QJsonArray
if(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对象的 QJsonArray
if(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数据我们都已经解析出来了