一、相关类
模块:core 使用时需在pro文件添加 QT += core
类名 | 简述 |
---|
QJsonArray | 封装了JSON数组 | QJsonDocument | 对JSON 文档的读写支持 | QJsonObject | 封装JSON对象 | QJsonParseError | 记录JSON解析过程的错误 | QJsonValue | 封装纯在JSON文件里的值 |
二、自我理解
1、Json简介
JSON格式的文档一般都是用{ }来包括的,内部是以键值对规范的
- 数据在名称/值对中
- 数据由逗号分隔
- 大括号 {} 保存对象
- 中括号 [] 保存数组,数组可以包含多个对象
键: 必须是字符串 值: 多种类型,可以是对象、字符串,数组、数字、bool等 (其实就是值是支持嵌套)
参考QJsonValue的类型
实例:
{
"sites": [
{ "name":"菜鸟教程" , "url":"www.runoob.com" },
{ "name":"google" , "url":"www.google.com" },
{ "name":"微博" , "url":"www.weibo.com" }
]
}
2、获取HTTP 请求的 JSON
开发时,能通过HTTPS API请求获得JSON数据
以 https://geoapi.qweather.com/v2/city/lookup?location=chaoyang&adm=beijing&key=你的开发Key 为例 具体API调用流程看这个web主页参考:https://geoapi.qweather.com
在Fiddler里面通过 WebView 按钮能看见 JSON视图下:
3、Qt对应QJSON相关类解释
- 一个Json内容 就是一个 QJsonDocument
- 凡是获取的Json内容是用 { } 括起来的是 对应 一个 QJsonObject
- 凡是获取的Json内容是用 [ ]括起来的是 对应 一个 QJsonArray
- 凡是在 ‘ : ’ 后面的是对应 一个 QJsonValue
下图 (只画了两个 QJsonObject ): 下图(画了三个 QJsonArray ): 下图(画了三个 QJsonValue ): 本例中的Json用Qt类的结构描述可看成这样
4、Qt实例代码说明
- (QJsonDocument支持装载 QJsonArray,QJsonObject )
- (使用的 如下函数
void setArray(const QJsonArray &array)
void setObject(const QJsonObject &object)
)
1、构造QJsonArray并装载于QJsonDocument中
类层次图: 代码:
#include <QCoreApplication>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QtDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QJsonArray jsArray;
QJsonDocument jsDocument_01;
jsArray.append(QJsonValue(124));
jsArray.append(QJsonValue(65));
QJsonObject object
{
{"property1", 1},
{"property2", 2}
};
jsArray.append(object);
jsDocument_01.setArray(jsArray);
qDebug()<<"JS: size: "<<jsDocument_01.array().size();
qDebug()<<"JS: array[0]: "<<jsDocument_01.array().at(0).toInt();
qDebug()<<"JS: array[1]: "<<jsDocument_01.array().at(1).toInt();
qDebug()<<"JS: array[2]: "<<jsDocument_01.array()[2].toObject()["property1"].toInt();
qDebug()<<"JS: array[2]: "<<jsDocument_01.array()[2].toObject()["property2"].toInt();
return a.exec();
}
2、构造QJsonObject并装载于QJsonDocument中
类层次图:
代码:
#include <QCoreApplication>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QtDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QJsonDocument jsDocument;
QJsonArray jsArray;
QJsonObject jsObject;
QJsonObject jsObject_01
{
{"property1", 1},
{"property2", 2}
};
jsArray.append(QJsonValue("成都市-双流区-xxx小区"));
jsArray.append(QJsonValue("已婚"));
jsArray.append(QJsonValue("血型:B型"));
jsObject.insert("name", QJsonValue("张三"));
jsObject.insert("sex", QJsonValue("男"));
jsObject.insert("phone", QJsonValue(1234564));
jsObject.insert("other", jsArray);
jsObject.insert("propites", jsObject_01);
jsDocument.setObject(jsObject);
qDebug()<<"jsDocument isEmpty: "<<jsDocument.isEmpty();
qDebug()<<"jsDocument.object(): "<<jsDocument.object();
qDebug()<<"name: "<<jsDocument.object().value("name").toString();
qDebug()<<"sex: "<<jsDocument.object().value("sex").toString();
qDebug()<<"phone: "<<jsDocument.object().value("phone").toInt();
qDebug()<<"other-0: "<<jsDocument.object().value("other").toArray()[0].toString();
qDebug()<<"other-1: "<<jsDocument.object().value("other").toArray()[1].toString();
qDebug()<<"other-2: "<<jsDocument.object().value("other").toArray()[2].toString();
qDebug()<<"propites-0: "<<jsDocument.object().value("propites").toObject().value("property1").toInt();
qDebug()<<"propites-1: "<<jsDocument.object().value("propites").toObject().value("property2").toInt();
return a.exec();
}
调试图:(看jsObject即可) 运行图:
3、从QByteArray读取数据(解析服务器返回JSON数据)
假设获取到服务器的数据是 QByteArray 内容如下(已经处理了): <<< 欲知道如何获取到QByteArray 的Json数据,参看链接:link >>>
QByteArray array("{\"code\":\"200\",\"location\":[{\"name\":\"\xE6\x9C\x9D\xE9\x98\xB3\","
"\"id\":\"101010300\",\"lat\":\"39.92149\",\"lon\":\"116.48641\",\"adm2\":"
"\"\xE5\x8C\x97\xE4\xBA\xAC\",\"adm1\":\"\xE5\x8C\x97\xE4\xBA\xAC\xE5\xB8\x82\","
"\"country\":\"\xE4\xB8\xAD\xE5\x9B\xBD\",\"tz\":\"Asia/Shanghai\",\"utcOffset\":"
"\"+08:00\",\"isDst\":\"0\",\"type\":\"city\",\"rank\":\"15\",\"fxLink\":"
"\"http://hfx.link/2az1\"}],\"refer\":{\"sources\":[\"QWeather\"],\"license\":["
"\"commercial license\"]}}");
类层次图: 代码:
#include <QCoreApplication>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QtDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QByteArray array("{\"code\":\"200\",\"location\":[{\"name\":\"\xE6\x9C\x9D\xE9\x98\xB3\","
"\"id\":\"101010300\",\"lat\":\"39.92149\",\"lon\":\"116.48641\",\"adm2\":"
"\"\xE5\x8C\x97\xE4\xBA\xAC\",\"adm1\":\"\xE5\x8C\x97\xE4\xBA\xAC\xE5\xB8\x82\","
"\"country\":\"\xE4\xB8\xAD\xE5\x9B\xBD\",\"tz\":\"Asia/Shanghai\",\"utcOffset\":"
"\"+08:00\",\"isDst\":\"0\",\"type\":\"city\",\"rank\":\"15\",\"fxLink\":"
"\"http://hfx.link/2az1\"}],\"refer\":{\"sources\":[\"QWeather\"],\"license\":["
"\"commercial license\"]}}");
QByteArray outPut;
QJsonDocument jsDocument;
QJsonParseError jsParaseError;
QJsonArray jsArray;
QJsonObject jsObject;
jsDocument = QJsonDocument::fromJson(array, &jsParaseError);
if(jsParaseError.error == QJsonParseError::NoError)
{
qDebug()<<"jsDocument isNull(): "<<jsDocument.isNull();
qDebug()<<"jsDocument isEmpty(): "<<jsDocument.isEmpty();
qDebug()<<"jsDocument isArray(): "<<jsDocument.isArray();
qDebug()<<"jsDocument isObject: "<<jsDocument.isObject();
jsObject = jsDocument.object();
jsArray = jsDocument.array();
}
qDebug()<<"jsObject contains(code):"<<jsObject.contains("code");
qDebug()<<"jsObject contains(location):"<<jsObject.contains("location");
qDebug()<<"jsObject contains(refer):"<<jsObject.contains("refer");
qDebug()<<"jsObject count(): "<<jsObject.count();
qDebug()<<"jsObject keys(): "<<jsObject.keys();
qDebug()<<"jsObject length(): "<<jsObject.length();
qDebug()<<"jsObject size(): "<<jsObject.size();
qDebug()<<"code.value(): "<<jsObject.value("code").toString();
qDebug()<<"location.name.value(): "<<jsObject.value("location").toArray()
[0].toObject().value("name").toString();
qDebug()<<"location.id.value(): "<<jsObject.value("location").toArray()
[0].toObject().value("id").toString();
qDebug()<<"location.lat.value(): "<<jsObject.value("location").toArray()
[0].toObject().value("lat").toString();
qDebug()<<"location.lon.value(): "<<jsObject.value("location").toArray()
[0].toObject().value("lon").toString();
qDebug()<<"location.adm2.value(): "<<jsObject.value("location").toArray()
[0].toObject().value("adm2").toString();
qDebug()<<"location.adm1.value(): "<<jsObject.value("location").toArray()
[0].toObject().value("adm1").toString();
qDebug()<<"location.country.value(): "<<jsObject.value("location").toArray()
[0].toObject().value("country").toString();
qDebug()<<"location.fxLink.value(): "<<jsObject.value("location").toArray()
[0].toObject().value("fxLink").toString();
qDebug()<<"refer.sources.values(): "<<jsObject.value("refer").toObject()
.value("sources").toArray()[0].toString();
qDebug()<<"refer.license.values(): "<<jsObject.value("refer").toObject()
.value("license").toArray()[0].toString();
return a.exec();
}
运行图:
三、总结
- JSON中的值可以多重嵌套
- QJsonValue对应不同的值时需要层层转换(使用toXXX转换,toInt,toArray,toObject)
- QJsonValue中间转换过程可能复杂,但最后一层转换为可用数据一定是转换为 Qt内建的基础数据类型如下图的 QString, int,Bool等
- 全过程大概示意图如下:
|