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

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值