Qt使用QJson模塊實(shí)現(xiàn)解析Json文件
0 引言
在項(xiàng)目開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)遇到讀寫(xiě)Json文件的需求,掌握J(rèn)son文件的操作是基礎(chǔ)中的基礎(chǔ)。
1 Json數(shù)據(jù)分析
要讀取的Json數(shù)據(jù)格式如下:
[ { "name":"ggr", "info": { "age":21, "height":174 } }, { "name":"lbw", "info": { "age":21, "height":174 } } ]
接下來(lái)以QJson模塊的角度,來(lái)解析這個(gè)Json數(shù)據(jù)
整個(gè)文件數(shù)據(jù)可以轉(zhuǎn)換為 QJsonDocument 類型,其中有 “[ ]” 方括號(hào)、 "{ }“花括號(hào)、” : "冒號(hào)。
- 被 “[ ]” 方括號(hào)包圍的數(shù)據(jù)是QJsonArray數(shù)組類型。
- 被 "{ }"花括號(hào)包圍的數(shù)據(jù)是QJsonObject對(duì)象類型。
- " : "冒號(hào)兩側(cè)的分別是Key和Value(key : value),冒號(hào)左右有空格不影響數(shù)據(jù)讀取。
先了解四個(gè)重要的類型
- QJsonDocument類型,指的是整個(gè)Json數(shù)據(jù)。
- QJsonArray數(shù)組類型的元素是QJsonValue類型。
- QJsonObject類型的元素是鍵值對(duì),也就是 Key: Value 類型。Key 是字符串類型,Value 的類型是 QJsonValue。
- QJsonValue類型 可以轉(zhuǎn)換成 QJsonObject 類型、int型、double型、QString類型、QJsonArray類型等基礎(chǔ)數(shù)據(jù)類型。
總結(jié):QJsonDocument 可以轉(zhuǎn)換為 QJsonArray 或QJsonObjec t類型。然后 QJsonArray 中的元素和 QJsonObject 中鍵值對(duì)的值的類型都是 QJsonValue 類型。QJsonValue 類型可以轉(zhuǎn)換成QJsonArray、QJsonObject、int、double、QString、bool等類型。(相當(dāng)于閉環(huán)了,設(shè)計(jì)的非常巧妙)
2 解析Json數(shù)據(jù)
1.首先添加一些頭文件
#include <QFile> // 用于打開(kāi)文件 #include <QJsonParseError> // 返回錯(cuò)誤信息 #include <QJsonArray> // Json數(shù)據(jù)對(duì)象 #include <QJsonDocument> // Json文檔對(duì)象 #include <QJsonObject> // 普通Json對(duì)象 #include <QDebug> // 打印數(shù)據(jù)
2.新建一個(gè)函數(shù)解析Json數(shù)據(jù)
bool ReadJson::praseJsonFile(const QString &sJsonPathFn) { //--------------------------------------------------------------------------------------------- //1.讀取磁盤(pán)中的文件 QFile file( sJsonPathFn ); if (!file.open(QIODevice::ReadOnly)) return false; QJsonParseError result; QJsonDocument root_Doc = QJsonDocument::fromJson(file.readAll(), &result); // 將文件數(shù)據(jù)格式化為JsonDocument對(duì)象 if( result.error != QJsonParseError::NoError ) return false; // 數(shù)據(jù)格式錯(cuò)誤就返回 //--------------------------------------------------------------------------------------------- QJsonArray roots = root_Doc.array(); // 將JsonDocument對(duì)象轉(zhuǎn)換為QJsonArray類型 //--------------------------------------------------------------------------------------------- //2.遍歷QJsonArray數(shù)組 for (int i=0; i<roots.size(); i++) { QJsonObject root = roots.at(i).toObject(); // 讀取name和info的值 QString name = root.value("name").toString(); QJsonObject info = root.value("info").toObject(); // 讀取info對(duì)象中age和height的值 int age = info.value("age").toInt(); int height = info.value("height").toInt(); // 打印讀取的數(shù)據(jù) qDebug() << "name = " << name; qDebug() << "info.age = " << age; qDebug() << "info.height = " << height; } //--------------------------------------------------------------------------------------------- return true; }
其實(shí)只要掌握關(guān)鍵的函數(shù),就能看懂上面的代碼:
1.readAll()
這是將文本文件讀取成 QByteArray 類型的函數(shù)
2.QJsonDocument的fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR)函數(shù)
這是將 QByteArray 類型的字符數(shù)組轉(zhuǎn)換成 QJsonDocument 類型的函數(shù)。
3.QJsonDocument 有兩個(gè)函數(shù),分別是 object() 和 array() 函數(shù),它們可以將自己轉(zhuǎn)換成 QJsonArray 類型或者 QJsonObject 類型
使用 object() 還是 array() 函數(shù)就看Json數(shù)據(jù)最開(kāi)頭的是 方括號(hào) 還是 花括號(hào) ,本文數(shù)據(jù)是方括號(hào)開(kāi)頭,所以使用的是 array() 函數(shù)。
4.QJsonArray 的 at(int index) 函數(shù),用于訪問(wèn)數(shù)組索引等于 index 的元素。
QJsonObject 的 value(const QString &key) 函數(shù),用于讀取花括號(hào)中的鍵值對(duì)的值。根據(jù)key的值,讀取value的值。
5.該函數(shù)返回的是 QJsonValue 類型
QJsonValue 中的 toObject、toString、toInt、toDouble、toBool、toArray 函數(shù)用于將 QJsonValue 裝換為 QJsonObject、QString、int、double、bool、QJsonArray 類型
到此這篇關(guān)于Qt使用QJson模塊實(shí)現(xiàn)解析Json文件的文章就介紹到這了,更多相關(guān)Qt QJson解析Json內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談在函數(shù)中返回動(dòng)態(tài)的內(nèi)存
下面小編就為大家?guī)?lái)一篇淺談在函數(shù)中返回動(dòng)態(tài)的內(nèi)存。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12C++語(yǔ)言實(shí)現(xiàn)開(kāi)心消消樂(lè)
這篇文章主要為大家詳細(xì)介紹了C++語(yǔ)言實(shí)現(xiàn)開(kāi)心消消樂(lè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12C++基礎(chǔ)知識(shí)之運(yùn)算符重載詳解
這篇文章主要為大家詳細(xì)介紹了C++基礎(chǔ)知識(shí)之運(yùn)算符重載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02C/C++實(shí)現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換的多種方法
在C/C++程序中,會(huì)需要把數(shù)字與字符串做出互相轉(zhuǎn)換的操作,用于實(shí)現(xiàn)程序想要的效果,下面將介紹多種方法實(shí)現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2024-08-08C++詳細(xì)講解互斥量與lock_guard類模板及死鎖
線程的主要優(yōu)勢(shì)在于,能夠通過(guò)全局變量來(lái)共享信息。不過(guò),這種便捷的共享是有代價(jià)的:必須確保多個(gè)線程不會(huì)同時(shí)修改同一變量,或者某一線程不會(huì)讀取正由其他線程修改的變量。為了防止出現(xiàn)線程某甲試圖訪 問(wèn)一共享變量時(shí),線程某乙正在對(duì)其進(jìn)行修改。引入了互斥量2022-07-07