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.然后把它们放到你生成的可执行文件目录,再次运行,该错误消失。