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数据我们都已经解析出来了