待解决的问题
涉及的知识点
需要解决的技术问题:
QNetworkAccessManager -
Allows the application to send network requests and receive replies
QNetworkRequest
Holds a request to be sent with QNetworkAccessManager
QNetworkReply
Contains the data and headers for a request sent with QNetworkAccessManager
关系图:
(参考资料:http://blog.csdn.net/chenlong12580/article/details/7392766)
我的理解是:QNetworkRequest设置网络请求的各个参数,QNetworkReply用于接收服务器返回的数据。而QNetworkAccessManager充当着一个中介的作用,设置post、get等方式将request发出去,然后监测服务器是否返回数据(存在QNetworkReply中),并将返回得来的reply委托给一个slot处理。
所以当进行网络请求的时候,要做的事情:
- 生成QNetworkRequest对象,设置请求头、请求所用API所需实参、url等信息;
- 准备解析处理QNetworkReply的slot;
- 生成QNetworkAccessManager,发送request,并将返回来的reply委托给该slot处理(实现上就是一条connect语句)
请先阅读:
http://www.w3school.com.cn/json/index.asp
http://www.w3school.com.cn/json/json_syntax.asp
无论是设置request所需的参数信息,还是返回来的reply,其数据均采用QJson的形式表示,所以要实现网络请求,QJson的生成和解析重要。
QJson是一个基于Qt的开发包用来将JSON数据解析成QVariant对象,JSON的数组将被映射为QVariantList实例,而其他对象映射为QVariantMap实例。
(一)与QJson相关的类
The QJsonDocument class provides a way to read and write JSON documents. QJsonDocument is a class that wraps a complete JSON document and can read and write this document both from a UTF-8 encoded text-based representation as well as Qt’s own binary format.
我的理解:text-based representation 应该是指形如[“Qt”,”version”,true]的表现形式,而这个整体就是一个基于text-based representation的JSON document了。这个整体在Qt中可以被存储在QByteArray中。QJsonDocument则是Qt中对JSON document进行读写的工具。
A document can be queried as to whether it contains an array or an object using isArray() and isObject(). The array or object contained in the document can be retrieved using array() or object() and then read or manipulated.
这里对应着Json中数组和对象的概念。相应地,Qt中提供与对象、数组相关的两个类:
The QJsonObject class encapsulates a JSON object.A JSON object is a list of key value pairs, where the keys are unique strings and the values are represented by a QJsonValue.
You can convert the object to and from text based JSON through QJsonDocument.
The QJsonArray class encapsulates a JSON array.A JSON array is a list of values. The list can be manipulated by inserting and removing QJsonValue’s from the array.You can convert the array to and from text based JSON through QJsonDocument.
上面介绍了Qt中与Json有关的一些类以及它们之间的关系,那么具体如何利用这些类来生成和解析Json呢?注意到,Qt的帮助文档中提到,无论是对QJsonObject而言,还是对QJsonArray而言,他们均可通过QJsonDocument与Json document进行转换。
下面就分别基于QJsonObject和QJsonArray介绍这些类的使用方法。下面使用的代码均来自http://blog.sina.com.cn/s/blog_a6fb6cc90101gnxm.html。
代码理解:
1.展示了如何通过QJsonDocument使得QJsonObject、QJsonArray与Json document之间转换;
2. Json document 由QByteArray或者QString来表示;
3. QJsonParseError用于解析
(二)基于QJsonObject的Json生成与解析
1.生成Json
QJsonObject json;
json.insert("name", QString("Qt"));
json.insert("version", 5);
json.insert("windows", true);
QJsonDocument document;
document.setObject(json);
QByteArray byte_array = document.toJson(QJsonDocument::Compact);
QString json_str(byte_array);
结果:
json_str为: {"name": "Qt","version": 5,"windows": true}
2.解析Json
QJsonParseError json_error;
QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, &json_error);
if(json_error.error == QJsonParseError::NoError)
{
if(parse_doucment.isObject())
{
QJsonObject obj = parse_doucment.object();
if(obj.contains("name"))
{
QJsonValue name_value = obj.take("name");
if(name_value.isString())
{
QString name = name_value.toString();
}
}
if(obj.contains("version"))
{
QJsonValue version_value = obj.take("version");
if(version_value.isDouble())
{
int version = version_value.toVariant().toInt();
}
}
if(obj.contains("windows"))
{
QJsonValue version_value = obj.take("windows");
if(version_value.isBool())
{
bool flag = version_value.toBool();
}
}
}
}
结果:
name:Qt
version:5
windows:true
(三)基于QJsonArray的的Json生成与解析
1.生成Json
QJsonArray json;
json.insert(0, QString("Qt"));
json.insert(1, QString("version"));
json.insert(2, true);
QJsonDocument document;
document.setArray(json);
QByteArray byte_array = document.toJson(QJsonDocument::Compact);
QString json_str(byte_array);
结果:
json_str:["Qt","version",true]
2.解析Json
QJsonParseError json_error;
QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, &json_error);
if(json_error.error == QJsonParseError::NoError)
{
if(parse_doucment.isArray())
{
QJsonArray array = parse_doucment.array();
int size = array.size();
for(int i=0; i
{
QJsonValue value = array.at(i);
if(value.isString())
{
QString name = value.toString();
}
else if(value.isBool())
{
bool flag = value.toBool();
}
}
}
}
结果:
数组不同下标对应的值
0:Qt
1:version
2:true