QT--HTTP协议的JSON的解析

Qt提供了相应的类来处理Json,处理步骤如下:

1.通过json字符串构造一个json文本对象
    QJsonDocument::fromJson(json数据,错误信息);
2.把json文本对象转换成json对象
    QJsonObject obj = doc.object();
3.在json对象中根据key获取value
    obj.value("key").toString();
    obj.value("key").toArray();  

用法实例如下:
httpdownload.h

#ifndef HTTPDOWNLOAD_H
#define HTTPDOWNLOAD_H

#include <QMainWindow>
#include <QtNetwork>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonParseError>
#include <QMessageBox>
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui {
    
     class HttpDownload; }
QT_END_NAMESPACE

class HttpDownload : public QMainWindow
{
    
    
    Q_OBJECT

public:
    HttpDownload(QWidget *parent = nullptr);
    ~HttpDownload();

private slots:
    void on_pushButton_clicked();

    void readdata_slot(QNetworkReply *reply);
private:
    Ui::HttpDownload *ui;

    QNetworkAccessManager *manager;             //Http管理对象
};
#endif // HTTPDOWNLOAD_H

httpdownload.c

#include "httpdownload.h"
#include "ui_httpdownload.h"

HttpDownload::HttpDownload(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::HttpDownload)
{
    
    
    ui->setupUi(this);
    manager = new QNetworkAccessManager(this);

    //连接请求完成和读取数据的槽
    QObject::connect(manager,&QNetworkAccessManager::finished,this,&HttpDownload::readdata_slot);
}

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

//发送请求
void HttpDownload::on_pushButton_clicked()
{
    
    
    //获取url
    QUrl url(ui->lineEdit->text());

    //创建http请求
    QNetworkRequest request(url);

    //发送http请求 ----- GET
    manager->get(request);
}

//获取请求返回的数据
void HttpDownload::readdata_slot(QNetworkReply *reply)
{
    
    
    QByteArray arr = reply->readAll();
    ui->textBrowser->setText(arr);

    //解析Json
    QJsonParseError error;
    QJsonDocument doc = QJsonDocument::fromJson(arr,&error);

    //判断json数据是否完整
    if(error.error!=QJsonParseError::NoError)
    {
    
    
        //设置弹窗
        QMessageBox box;
        box.setText("Json数据错误!");
        box.setStandardButtons(QMessageBox::Ok);
        box.exec();

        return;
    }

    //将文本对象转换成json对象
    QJsonObject obj = doc.object();

    //在json对象中根据key获取value
    qDebug()<<obj.value("success").toString();

    //解析数组
    QJsonArray json_arr = obj.value("result").toArray();
    QJsonObject json_obj = json_arr.at(0).toObject();

    QString citynm = json_obj.value("citynm").toString();
    QString weather = json_obj.value("weather").toString();
    QString temperature = json_obj.value("temperature").toString();

    //显示
    ui->label->setText(citynm+":"+weather+" "+temperature);
}

运行结果:
在这里插入图片描述
编译环境windows10,+QT5.12.0
在这里插入图片描述
完整代码:https://download.csdn.net/download/weixin_43793181/13115669

编译时如果出现错误:qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed
1.首先确定你选择打开工程的编译器是64位还是32位,确定方法如下(构建套件一栏):
在这里插入图片描述
2.去QtCreator的安装目录,搜索ssleay32.dll和libeay32.dll,找到mingw730_64路径下的文件
在这里插入图片描述

在这里插入图片描述

3.然后把它们放到你生成的可执行文件目录,再次运行,该错误消失。

猜你喜欢

转载自blog.csdn.net/weixin_43793181/article/details/109709373