一、什么是json
JSON就是数据封装形式,它是用来封装数据,相当于一个 包装盒子。
JSON对象 ---- > 单个类型的数据,比如:int char string
JSON数组 ----> 相当于一个数组,可以用来存放:int char ,类类型
在数据封装中,使用符号“{ }”代表对象,使用符号“[ ]”代表数组
JSON对象和JSON数组的关系:
JSON对象可以嵌套JSON数组
JSON数组可以嵌套JSON对象
JSON对象可以嵌套JSON对象
JSON数组可以嵌套JSON数组
下面是一个json格式的文件,(格式内容大家可以直接去网上去搜索json格式验证)
{
"error_code": 0,
"reason": "请求成功!",
"result": [
{
"day": 1,
"des": "1907年11月1日 电影导演吴永刚诞生 吴永刚,1907年11月1日生于江苏吴县。1932年后参加影片《三个摩登女性》、《母性之光》的拍摄工作。1934年在联华影片公司编导处女作《神女》,一举成名,...",
"id": 9000,
"lunar": "丁未年九月廿六",
"month": 11,
"pic": "",
"title": "电影导演吴永刚诞生",
"year": 1907
},
{
"day": 1,
"des": "1902年11月1日 挪威作家格里格诞生 格里格,1902年11月1日生于卑尔根。挪威作家。 青年时代在奥斯陆和牛津求学,好旅行。1924年出版描写海员生活的小说《航船在前进》。1926年至1927年在...",
"id": 9010,
"lunar": "壬寅年十月初二",
"month": 11,
"pic": "",
"title": "挪威作家格里格诞生",
"year": 1902
},
{
"day": 1,
"des": "1911年11月1日,清廷宣布解散皇族内阁,任命袁世凯为内阁总理大臣,要他赶快从前线回京,筹组“责任内阁”。11月13日,袁世凯抵达北京,16日组织新内阁,以梁郭彦为外务大臣,赵秉钧为民政大臣,...",
"id": 3577,
"lunar": "辛亥年九月十一",
"month": 11,
"pic": "",
"title": "袁世凯出任清朝内阁总理大臣",
"year": 1911
}
]
}
从上面的格式可以看出:JSON数据都是键值对(key-value),可以通过键来获取对应的值
在QT中,对于Json数据的接口,我们通常使用面向对象的思想来描述
JSON文件 ------ 后缀(json)--------QJsonDocument --------比如:hello.json
JSON对象 -----QJsonObject
JSON数组 ------ QJsonArray
关于json接口类属于QT += core中
二、解析Json的步骤:
1.将JSON文件转换成QJsonDocument对象,具体来讲,是将json文件中的
数据转换成 json文档对象(QJsonDocument )
对应函数
QJsonDocument
fromJson(const QByteArray &json, QJsonParseError *error = nullptr)
①
功能:
将QByteArray &json转换成QJsonDocument
②参数:
QByteArray &json ------- json数据,它可以从JSON文件中进行读取
2.从QJsonDocument对象中将JSON数据拿出来
对于
于QJsonDocument中,只有两个部分组成:QJsonArray和 QJsonObject
QJsonObject object() const
功能:从QJsonDocument中得到一个QJsonObject
QJsonArray array() const
功能:从QJsonDocument中得到一个QJsonArray
3.
要根据提供的数据格式来解析数据(下面代码就是根据上面的json文件进行解析的)
//1 读取文件中数据
QFile file("../qt_day6_1_json_parser/text.json");
if(file.open(QIODevice::ReadOnly))
{
QByteArray array = file.readAll();
//2. 数据解析 ---- 从文档的最外层开始,一层一层往里进行解析,遇见 "{" --- 就使用QJsonObject 遇见 "["--- 就使用QJsonArray
//然后真正去获取值时,要通过键值对的键来进行,键是字符串类型--- value(QString key),最后,根据数据的类型通过to系统方法来转换完成
//第一步:将字节数组转换成json文档
QJsonDocument doc = QJsonDocument::fromJson(array);
//第二步:QJsonDocument文档类中,包括了json对象和json数据这两个成员,所以就有两对象set/get函数
// QJsonObject object() const 和 void setObject(const QJsonObject &object)
// void setArray(const QJsonArray &array) QJsonArray array() const
//根据json数据格式,最外面是json对象({})还是json数组([]),如果是json对象,则使用QJsonObject object() const
QJsonObject object = doc.object();
//第三步:不管是json对象还是json数组,它们里面的数据都是键值对组成,所以,就可以通过键来获了对应的值 --- value
//QJsonValue value(const QString &key) const QJsonValue是可以转换成数字 字符串 和对象 数组,是
//通过这个类的to****()方法来完成
QJsonArray resultArray = object.value("result").toArray(); //如果是json数组的话,跟数组的概念完全相同
//通过for循环来遍历 数据
for (int i=0;i<resultArray.size();i++) {
QJsonObject resultObject = resultArray.at(i).toObject();
QString title = resultObject.value("title").toString();
int year = resultObject.value("year").toInt();
qDebug() << "title = " << title;
qDebug() << "year = " << year;
}
}
file.close();
三、解析数据时常用的接口
1.对于
QJsonDocument类:
①解析时:
QJsonArray array() const //通过get方法,得到QJsonDocument类中的json 数组
QJsonObject object() const//通过get方法,得到QJsonDocument类中的json 对象
②打包时
void setArray(const QJsonArray &array)//将QJsonArray打包到 QJsonDocument中
void setObject(const QJsonObject &object)
③将QJsonDocument和QByteArray相互转换的接口:
静态成员函数:
QJsonDocumen t fromJson(const QByteArray &json, QJsonParseError *error = nullptr)
功能:将
QByteArray数据转换成QJsonDocument
参数说明:
const QByteArray &
json ------ 从JSON文件中读取的数据
QJsonParseError *
error ----- QByteArray在转换成
QJsonDocument,出错时,它的出错信息 做为一个输出参数
④
将QJsonDocment转换成QByteArray
普通成员函数:
QByteArray toJson() const
QByteArray toJson(QJsonDocument::JsonFor mat format) const
功能:将QJsonDocment转换 成QByteArray,以便将数据写入到json文件中
2.QJsonArray类
①获取json数组中的数据元素
QJsonValue at(int i) const
参数说明:
int
i ----- 数据元素的下标
返回值:
成功返回一个
QJsonValue
QJsonValue它是json中封装的一个数据类型,类似于int,char ,它可以跟int 、double、QString QJsonArray QJsonObject之间可以相互转换
它代表以下6种类型之一:
它们的相互之间的转换使用to方法:
QJsonArray toArray(const QJsonArray &defaultValue) const
QJsonArray toArray() const
bool toBool(bool defaultValue = false) const
double toDouble(double defaultValue = 0) const
int toInt(int defaultValue = 0) const
QJsonObject toObject(const QJsonObject &defaultValue) const
QJsonObject toObject() const QString toString() const
QString toString(const QString &defaultValue) const
②获取数组中 元素的个数
int size() const
3.
QJsonObject类:
①
根据键值来获得真正的数据
QJsonValue value(const QString &key) const
QJsonValue value(QLatin1String key) const
参数说明:
const QString &
key ------->键值就来源于json数据文档中键---- 都是字符串类型
比如:
"genres": "动作/惊悚/科幻", ------ genres它就是键(key)
如果该键对应值为字符串,那么可以通过
toString
() const