Qt中的http协议及其获取图片、json数据的解析和打包(QT六)

8 篇文章 2 订阅

一、Http通信

1.在tcp基础上封装的应用层协议 (key:value)

GET / HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134
Accept-Language: zh-CN
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Upgrade-Insecure-Requests: 1
Accept-Encoding: gzip, deflate
Host: 192.168.1.182:6789

2.HTTP通信流程

在这里插入图片描述

二、Qt中通过HTTP协议获取图片数据

1.在Qt中使用的类

QNetworkAccessManager–管理http通信

QNetworkRequest - -请求内容

QNetworkReply–接收服务器的回应

2.获取数据过程

(1)创建QNetworkAccessManager对象

连接服务器(连接主机) -> 通过域名服务器把域名解析ip地址

QNetworkAccessManager manager;

(2)发送请求

//发送请求
QUrl url(ui->lineEdit->text());
QNetworkRequest request(url);
manager.get(request);//发送请求 

当请求完毕会发送finished信号

connect(&manager,&QNetworkAccessManager::finished,this, &HttpShowPictrue::read_data);

(3)接收数据

//通过应答对象读取数据
QByteArray array = reply->readAll();
QPixmap mmp;
mmp.loadFromData(array);//把接收的数据存储在图片空间中
mmp.save("./my.jpg");
//设置尺寸
mmp = mmp.scaled(ui->label->size());
ui->label->setPixmap(mmp);

三、json数据

1.json数据格式

对象:{ } -> 对象中只能存储键值对

例:{“name”:“何青德”, “address:”:“广州”}

数组:[ ] -> 存储同类型数据(数值, 字符串,对象, 数组)

例:[1,2,3,4], [“a”,“b”], [{ }, { }, { }], [[ ],[ ]]

键值: key:value -> key:是字符串, value:可以是数值,数组,字符串,对象

注意:所有的符号不能有中文输入

例如学生信息:

学生(姓名,年龄,分数(c语言,c++,qt))jack, rose

{"student":
    [
        {"name":"jack","age":20,"score":[80,90,70]},
        {"name":"rose","age":19,"score":[90,80,90]}
	]
}

2.天气数据json格式

天气api接口http://t.weather.sojson.com/api/weather/city/101280101

data = 
{
"cityInfo": 
	{
		"city": "广州市"
	},
"data": 
	{
		"shidu": "88%",
		"forecast": 
		[{
			"high": "高温 22℃",
			"low": "低温 17℃",
			"notice": "雨虽小,注意保暖别感冒"
		}]
	}
}

3.添加头文件

#include<QJsonObject>
#include<QJsonArray>
#include<QJsonValue>
#include<QJsonDocument>
#include<QJsonParseError>

4.解析

(1)把读取的数据data转QJsonDocument

QJsonParseError err;
QJsonDocument doc = QJsonDocument::fromJson(data.toUtf8(),&err);
if(err.error != QJsonParseError::NoError) //检测是否是json格式
{
    qDebug()<<"json error";
}

(2)把doc转为要解析的对象

QJsonObject obj = doc.object();

(3)由obj的键data获取对象

QJsonObject dataObj = obj.value("data").toObject();

(4)由dataObj的键forecast获取数组

QJsonArray forecastArray = dataObj.value("forecast").toArray();

(5)获取数组长度 -> 取到数组中的第一个对象

qDebug()<<forecastArray.size(); //数组长度--元素个数
if(forecastArray.size() > 0)
{
    QJsonObject forecastArrayObj = forecastArray.at(0).toObject();
}

(6)由forecastArrayObj的键或者对应值

QJsonObject forecastArrayObj = forecastArray.at(0).toObject();
QString high = forecastArrayObj.value("high").toString();
QString low = forecastArrayObj.value("low").toString();
QString notice = forecastArrayObj.value("notice").toString();

5.json格式打包

下面下面json格式数据

{
"data": 
	{
		"shidu": "88%",
		"forecast":
	 		{
					"high": "高温 22℃",
					"low": "低温 17℃",
					"notice": "雨虽小,注意保暖别感冒"
			}
	}
}

(1)最外是一个对象{}

QJsonObject obj;

(2)创建 -> 键为data的对象

QJsonObject dataObj;
//在dataObj对象插入shidu
dataObj.insert("shidu","88%");

(3)先创建forecast对象并且插入数据,后把对象插入到dataObj中

//创建forecast对象
QJsonObject forecastObj;
forecastObj.insert("high","高温 22℃");
forecastObj.insert("low","低温 17℃");
forecastObj.insert("notice","雨虽小,注意保暖别感冒");

(4)把forecast对象插入到dataobj中

dataObj.insert("forecast", forecastObj);

(5)把dataObj插入到最外层对象obj中

obj.insert("data",dataObj);

(6)把打包好的obj对象转为字符串发送/保存

//把obj转为字符串
QJsonDocument doc;
doc.setObject(obj);  //把打包好的json数据给到document
QByteArray array = doc.toJson();   把json格式的对象转为字符串
ui->textBrowser->setText(QString(array));

QJsonArray  jsonarray;数组
jsonarray.append(forecastA)给数组添加对象
jsonarray.append(forecastB)
  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

Java.L

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

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

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

打赏作者

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

抵扣说明:

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

余额充值