QT中http和json数据解析

1.http协议的原理
          http协议属于应用层中的一种协议,它内部也是使用tcp来通信
          比如:彭老师上百度,搜索关键字中美合作
          分析:浏览器 --》tcp客户端
                    百度服务器 --》tcp服务器
                    www.baidu.com --》百度的域名(俗称网址,URL地址)--》浏览器会把域名解析成ip地址和端口号
          理论分析:
                    浏览器把http请求发送(搜索关键字中美合作)给百度的服务器--》百度服务器收到请求之后会自动回复应答信息给本地浏览器--》浏览器接收应答信息,把应答信息在浏览器显示出来即可

   2.QT中http协议的通信流程
          涉及到的类
                   QNetworkRequest  --》http请求信息
                   QNetworkAccessManager --》管理http,发送请求
                   QNetworkReply --》http应答信息
          (1)定义QNetworkRequest请求对象
                              QNetworkRequest::QNetworkRequest(const QUrl &url)
                                                   参数:url --》QUrl是QT中用来表示网址的一个类型
                                                             QUrl::QUrl(const QString &url)
                                                                          参数:url --》你要访问的网址
          (2)定义QNetworkAccessManager类的对象,用该对象发送刚才的请求
                             QNetworkAccessManager::QNetworkAccessManager(QObject *parent = nullptr)
                             QNetworkReply *QNetworkAccessManager::get(const QNetworkRequest &request)
                                                  参数:request --》你刚才定义的请求
          (3)如果请求发送成功,QNetworkAccessManager类的对象会自动触发void QNetworkAccessManager::finished(QNetworkReply *reply)信号,程序员需要主动关联这个信号,在槽函数中去读取应答信息
          (4)在finished(QNetworkReply *reply)信号对应的槽函数中去读取应答信息
                              QNetworkReply读取应答信息--》read/readAll
     
   3.举例使用http协议
                例子一:在QT程序中通过http请求下载网络上图片,并显示
                             bool QPixmap::loadFromData(const QByteArray &data)
                                            参数:data --》图片的原始数据(颜色值)
                             注意:右键复制图片的网址,需要把https改成http(新版本的QT又不需要)
                                       https --》带有加密功能http协议
                                       http --》没有加密
               例子二:获取网址上的天气预报信息--》json数据解析
                            http://www.weather.com.cn/data/cityinfo/101010100.html
             http://www.weather.com.cn/data/sk/101010100.html
        101280101

http下载网络上的图片

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QUrl>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //主动关联finished信号
    connect(&manager,SIGNAL(finished(QNetworkReply *)),this,SLOT(fun(QNetworkReply *)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

//下载图片
void MainWindow::on_pushButton_clicked()
{
    //获取输入框中输入的网址
    QString urlstr=ui->lineEdit->text();
    //创建QUrl对象
    QUrl url(urlstr);
    //定义http请求
    QNetworkRequest req(url);

    //发送这个请求
    manager.get(req);
}
//读取应答信息
void MainWindow::fun(QNetworkReply *reply)
{
    //读取网址服务器回复的应答信息
    QByteArray buf=reply->readAll();
    //处理应答信息--》由于本例子中从往上下载的是图片,所以buf中存放的就是网上那张图片的颜色数据
    QPixmap map;
    map.loadFromData(buf);
    map.scaled(ui->label->width(),ui->label->height());
    ui->label->setScaledContents(true);
    //在标签上显示图片
    ui->label->setPixmap(map);

}

 4.json数据格式
            json数据:计算机前端开发中经常会用到的一种数据格式,保存信息很方便(比较复杂的信息,信息量很大的)
                            QMap --》键值对--》生活中成对出现的数据
            例如:{"weatherinfo":{"city":"北京","cityid":"101010100","temp1":"18℃","temp2":"31℃","weather":"多云转阴","img1":"n1.gif","img2":"d2.gif","ptime":"18:00"}}
            json数据的组成(三部分组成):
                     对象:  用{}表示,对象里面可以嵌套数组,键值对,其它对象   {{},{},{}}     {[],[],[]}   {键:值,键:值,键:值}    {{},[],键:值}    
                     数组:用[]表示,数组里面只能存放相同类型的数据   [{},{},{}]  [1,2,3]  [[],[],[]],   
                     键值对:键:值,键必须是字符串,值没有要求,值可以任何合法的数据类型

   5.如何解析json数据
            注意: 如果你要解析某个json数据,程序员必须事先知道这个json数据的格式,否则无法解析
            涉及到的类
                      QJsonDocument --》把json数据做规格化存储
                      QJsonObject --》对象
                      QJsonArray --》数组
                      QJsonValue --》值
                      QJsonParseError --》存放解析json数据过程中产生的错误信息
           思路步骤:
                 第一步:把json数据规格化存储
                              [static] QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = nullptr) 
                                                        返回值:QJsonDocument用来存放规格化存储的json数据
                                                           参数:json --》你要存储的json数据
                                                                    error --》保存解析过程中出现的错误信息
                第二步:严格按照你要解析的json数据,一步步剥洋葱
                              QJsonObject QJsonDocument::object() const  //获取对象
                              QJsonArray QJsonDocument::array() const     //获取数组
                              QJsonValue QJsonObject::value(const QString &key) const  //通过键得到值
                                                     返回值:返回键对应的值
                                                        参数:key --》键
                              QJsonValue类中有很多toxxxx()方法,原因是json数据规定键必须是字符串,值可以是任意类型
                                                   QJsonArray QJsonValue::toArray() const      //把QJsonValue值转成数组
                                                   int QJsonValue::toInt() const                         //把QJsonValue值转成整数
                                                   QJsonObject QJsonValue::toObject() const   //把QJsonValue值转成对象
                                                   QString QJsonValue::toString() const            //把QJsonValue值转成字符串

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QUrl>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //主动关联finished信号
    connect(&manager,SIGNAL(finished(QNetworkReply *)),this,SLOT(fun(QNetworkReply *)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

//获取网络上的天气预报信息
void MainWindow::on_pushButton_clicked()
{
    //获取输入框中输入的网址
    QString urlstr=ui->lineEdit->text();
    //创建QUrl对象
    QUrl url(urlstr);
    //定义http请求
    QNetworkRequest req(url);

    //发送这个请求
    manager.get(req);
}
//读取应答信息
void MainWindow::fun(QNetworkReply *reply)
{
    //读取网址服务器回复的应答信息
    QByteArray buf=reply->readAll();
    //处理应答信息--》由于本例子中从网络上获取的是天气预报信息(json格式的数据)
    //解析json数据
    //第一步:把json数据规格化
    QJsonDocument doc=QJsonDocument::fromJson(buf);

    //第二步:一步步拆分数据
    //获取最外层的对象
    //"weatherinfo":{"city":"北京","cityid":"101010100","temp1":"18℃","temp2":"31℃","weather":"多云转阴","img1":"n1.gif","img2":"d2.gif","ptime":"18:00"}
    QJsonObject obj=doc.object();
    //通过键"weatherinfo"得到对应的值
    QJsonValue value1=obj.value("weatherinfo");
    //{"city":"北京","cityid":"101010100","temp1":"18℃","temp2":"31℃","weather":"多云转阴","img1":"n1.gif","img2":"d2.gif","ptime":"18:00"}
    QJsonObject obj1=value1.toObject();
    //继续把对象中键值对获取出来
    QJsonValue value2=obj1.value("temp1");
    QString t1=value2.toString();
    QJsonValue value3=obj1.value("temp2");
    QString t2=value3.toString();
    qDebug()<<"最低气温: "<<t1;
    qDebug()<<"最高气温: "<<t2;
}

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Qt,可以使用QJsonDocument和QJsonObject类来解析和处理JSON数据。 首先,需要将JSON数据转换为QJsonDocument对象。可以使用QJsonDocument::fromJson()方法将JSON字符串或字节数组转换为QJsonDocument对象。例如: ```cpp QString jsonString = "{\"name\":\"John\",\"age\":30}"; QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8()); // 或者 QByteArray jsonData = "{\"name\":\"John\",\"age\":30}"; QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData); ``` 然后,可以通过调用`jsonDoc.object()`方法获取QJsonObject对象,以便访问和处理JSON数据的键值对。例如: ```cpp QJsonObject jsonObj = jsonDoc.object(); QString name = jsonObj["name"].toString(); int age = jsonObj["age"].toInt(); ``` 对于嵌套的JSON结构,可以通过递归方式进行解析。例如,如果JSON数据包含一个嵌套的数组: ```cpp QString jsonArrayString = "{\"people\":[{\"name\":\"John\",\"age\":30},{\"name\":\"Alice\",\"age\":25}]}"; QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonArrayString.toUtf8()); QJsonObject jsonObj = jsonDoc.object(); QJsonArray peopleArray = jsonObj["people"].toArray(); foreach (const QJsonValue& value, peopleArray) { QJsonObject personObj = value.toObject(); QString name = personObj["name"].toString(); int age = personObj["age"].toInt(); // 处理每个人的数据 } ``` 以上是一个简单的JSON解析示例,根据实际情况,可能需要根据JSON数据的结构进行更复杂的处理和解析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hqb_newfarmer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值