更新時(shí)間:2018-01-24 來(lái)源:黑馬程序員 瀏覽量:
JSON的全稱是”JavaScript Object Notation”,意思是JavaScript對(duì)象表示法,它是一種基于文本,獨(dú)立于語(yǔ)言的輕量級(jí)數(shù)據(jù)交換格式。JSON 解析器和 JSON 庫(kù)支持許多不同的編程語(yǔ)言,目前非常多的編程語(yǔ)言都支持JSON。接下來(lái)傳智播客C/C++培訓(xùn)專家為大家介紹一下Qt下的Json的使用。
Json的兩種結(jié)構(gòu)
JSON有兩種表示結(jié)構(gòu),對(duì)象和數(shù)組。
l 對(duì)象結(jié)構(gòu)以”{”大括號(hào)開始,以”}”大括號(hào)結(jié)束。中間部分由0或多個(gè)以”,”分隔的”key(關(guān)鍵字)/value(值)”對(duì)構(gòu)成,關(guān)鍵字和值之間以”:”分隔,語(yǔ)法結(jié)構(gòu)如代碼。
{
key1:value1,
key2:value2,
...
}
其中關(guān)鍵字是字符串,而值可以是字符串,數(shù)值,true,false,null,對(duì)象或數(shù)組。
l 數(shù)組結(jié)構(gòu)以”[”開始,”]”結(jié)束。中間由0或多個(gè)以”,”分隔的值列表組成,語(yǔ)法結(jié)構(gòu)如代碼。
[
true,
123,
“hello,world”
]
數(shù)組中的元素值類型可以相同也可不同。
Json格式的文件在使用的時(shí)候是十分靈活的,其中數(shù)組和對(duì)象之間也是可以相互嵌套的,大家可以按照自己的實(shí)際需求來(lái)定義成對(duì)應(yīng)的格式。例如:
[
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" },
{ "firstName":"Peter" , "lastName": "Jones" }
]
Qt5中JSON的生成與解析
Qt5 新增加了處理 JSON 的類,與 XML 類庫(kù)類似,均以 QJson 開頭,在 QtCore 模塊中,不需要額外引入其它模塊。Qt5 新增加六個(gè)相關(guān)類:
需要大家著重掌握的類為前四個(gè)。
QJsonDocument
該Json文檔類主要是把json格式的數(shù)據(jù)解析為Qt中的Json文檔對(duì)象,所有我們?cè)谑褂迷擃愔?,需要先把?shù)據(jù)準(zhǔn)備好:
] 解析Json
1. 使用QFile對(duì)象加載指定的Json格式文件
a) QFile file(”D:\\myjson.json”);
b) file.open(QIODevice::ReadWrite);
2. 通過(guò)QFile類中的read方法將文件數(shù)據(jù)讀到內(nèi)存
a) QByteArray json = file. readAll();
3. QJsonDocument::fromJson() 可以由 QByteArray 對(duì)象構(gòu)造一QJsonDocument 對(duì)象,用于我們的讀寫操作
a) QJsonDocument jsDoc;
b) jsDoc = QJsonDocument::fromJson(json.toUtf8());
QJsonObject
] 生成json對(duì)象
因?yàn)閖son對(duì)象為鍵值對(duì),所以我們可以使用QJsonObject類的insert方法,向該類對(duì)象中插入數(shù)據(jù)。
1. 創(chuàng)建空的QJsonObject對(duì)象
a) QJsonObject obj;
2. 使用insert方法向空對(duì)象中插入數(shù)據(jù)
a) obj.insert(“name”, “Jack”);
b) obj.insert(“age”, 26);
c) obj.insert(“isboy”, true);
] 解析json對(duì)象
1. 首先需要先得到一個(gè)QJsonDocument對(duì)象,然后判斷該對(duì)象是否是一個(gè)json對(duì)象,使用isObject()方法
2. 使用QJsonDocument類的object()方法可以將json文檔對(duì)象轉(zhuǎn)換為Json對(duì)象。
3. 可以通過(guò)QJsonObject對(duì)象的key值得到其value值,訪問方式為QJsonValue value = obj[key]
4. 使用QJsonValue類的成員方法將value值轉(zhuǎn)換為實(shí)際的數(shù)據(jù)類型。
QJsonDocument parse_doucment;
parse_doucment = QJsonDocument::fromJson(byte_array);
if(parse_doucment.isObject())
{
QJsonObject obj = parse_doucment.object();
if(obj.contains("name"))
{
QJsonValue name_value = obj["name"];
if(name_value.isString())
{
QString name = name_value.toString();
}
}
QJsonArray
] 生成Json
1. 創(chuàng)建Json數(shù)組:
a) QJsonArray json;
2. 使用QJsonArray類的insert方法插入數(shù)據(jù):
a) json.insert(0, QString("Qt"));
b) json.insert(1, QString("version"));
c) json.insert(2, true);
3. 創(chuàng)建Json文檔對(duì)象:
a) QJsonDocument document;
4. 將初始化完成的json數(shù)組對(duì)象設(shè)置給Json文檔對(duì)象
a) document.setArray(json);
5. 將json文檔對(duì)象轉(zhuǎn)換為QByteArray對(duì)象
a) QByteArray byte_array = document.toJson();
生成的文件格式:["Qt","version",true]
] 解析Json
1. 首先需要先得到一個(gè)QJsonDocument對(duì)象,然后判斷該對(duì)象是否是一個(gè)json數(shù)組,使用isArray()方法。
2. 使用QJsonDocument類的array()方法可以將json文檔對(duì)象轉(zhuǎn)換為Json對(duì)象。
3. 可以通過(guò)QJsonArray對(duì)象遍歷得到其中的每個(gè)value值,訪問方式與遍歷普通數(shù)組的方式相同。
4. 使用QJsonValue類的成員方法將value值轉(zhuǎn)換為實(shí)際的數(shù)據(jù)類型。
QJsonDocument parse_doucment;
parse_doucment = QJsonDocument::fromJson(byte_array);
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();
}
}
}
QJsonValue
在使用json對(duì)象或json數(shù)組對(duì)象得到對(duì)應(yīng)的value之后,該value值并不是最終的數(shù)據(jù)類型而是一個(gè)QJsonValue類型的屬性,我們必須通過(guò)該對(duì)象判斷該類型的實(shí)際類型,然后在將其轉(zhuǎn)換為對(duì)應(yīng)的數(shù)據(jù)類型:
] 類型判斷相關(guān)的成員方法:
n bool isArray() const // 是否為json數(shù)組
n bool isBool() const // 是否為布爾類型
n bool isDouble() const // 是否為浮點(diǎn)類型
n bool isNull() const // 是否為空
n bool isObject() const // 是否為json對(duì)象
n bool isString() const // 是否為字符串類型
] 數(shù)據(jù)類型轉(zhuǎn)換相關(guān)成員方法:
n QJsonArray toArray(const QJsonArray &defaultValue) const
n QJsonArray toArray() const // 轉(zhuǎn)為為json數(shù)組
n bool toBool(bool defaultValue = false) const // to布爾類型
n double toDouble(double defaultValue = 0) const
n int toInt(int defaultValue = 0) const
n QJsonObject toObject(const QJsonObject &defaultValue) const
n QJsonObject toObject() const // 轉(zhuǎn)換為json對(duì)象
n QString toString(const QString &defaultValue = QString()) const
生成Json
1. 創(chuàng)建JsonObject對(duì)象或數(shù)組(再次以對(duì)象舉例)
a) QJsonObject json;
2. 往json對(duì)象中添加鍵值對(duì)
a) json.insert("name", QString("Qt"));
b) json.insert("version", 5);
c) json.insert("windows", true);
3. 創(chuàng)建Json文檔對(duì)象
a) QJsonDocument document;
4. 將Json對(duì)象或數(shù)組設(shè)置給json文檔對(duì)象
a) document.setObject(json); // 數(shù)組:setArray(array)
5. 將文檔對(duì)象轉(zhuǎn)換為QByteArray類型的數(shù)據(jù)
a) QByteArray byte_array = document.toJson();
6. 將該數(shù)據(jù)通過(guò)QFile對(duì)象保存為磁盤文件。
最終格式:{"name": "Qt","version": 5,"windows": true}
好了,今天的的知識(shí)點(diǎn),傳智播客C/C++培訓(xùn)專家就給大家分享到這里,希望大家多多練習(xí),祝大家學(xué)習(xí)愉快!
本文版權(quán)歸黑馬程序員C/C++學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:黑馬程序員C/C++培訓(xùn)學(xué)院
首發(fā):http://c.itheima.com/