Qt使用QJson模塊實現(xiàn)解析Json文件
0 引言
在項目開發(fā)過程中,經(jīng)常會遇到讀寫Json文件的需求,掌握Json文件的操作是基礎(chǔ)中的基礎(chǔ)。
1 Json數(shù)據(jù)分析
要讀取的Json數(shù)據(jù)格式如下:
[
{
"name":"ggr",
"info":
{
"age":21,
"height":174
}
},
{
"name":"lbw",
"info":
{
"age":21,
"height":174
}
}
]
接下來以QJson模塊的角度,來解析這個Json數(shù)據(jù)
整個文件數(shù)據(jù)可以轉(zhuǎn)換為 QJsonDocument 類型,其中有 “[ ]” 方括號、 "{ }“花括號、” : "冒號。
- 被 “[ ]” 方括號包圍的數(shù)據(jù)是QJsonArray數(shù)組類型。
- 被 "{ }"花括號包圍的數(shù)據(jù)是QJsonObject對象類型。
- " : "冒號兩側(cè)的分別是Key和Value(key : value),冒號左右有空格不影響數(shù)據(jù)讀取。
先了解四個重要的類型
- QJsonDocument類型,指的是整個Json數(shù)據(jù)。
- QJsonArray數(shù)組類型的元素是QJsonValue類型。
- QJsonObject類型的元素是鍵值對,也就是 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 中鍵值對的值的類型都是 QJsonValue 類型。QJsonValue 類型可以轉(zhuǎn)換成QJsonArray、QJsonObject、int、double、QString、bool等類型。(相當于閉環(huán)了,設(shè)計的非常巧妙)
2 解析Json數(shù)據(jù)
1.首先添加一些頭文件
#include <QFile> // 用于打開文件 #include <QJsonParseError> // 返回錯誤信息 #include <QJsonArray> // Json數(shù)據(jù)對象 #include <QJsonDocument> // Json文檔對象 #include <QJsonObject> // 普通Json對象 #include <QDebug> // 打印數(shù)據(jù)
2.新建一個函數(shù)解析Json數(shù)據(jù)
bool ReadJson::praseJsonFile(const QString &sJsonPathFn)
{
//---------------------------------------------------------------------------------------------
//1.讀取磁盤中的文件
QFile file( sJsonPathFn );
if (!file.open(QIODevice::ReadOnly)) return false;
QJsonParseError result;
QJsonDocument root_Doc = QJsonDocument::fromJson(file.readAll(), &result); // 將文件數(shù)據(jù)格式化為JsonDocument對象
if( result.error != QJsonParseError::NoError ) return false; // 數(shù)據(jù)格式錯誤就返回
//---------------------------------------------------------------------------------------------
QJsonArray roots = root_Doc.array(); // 將JsonDocument對象轉(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對象中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;
}
其實只要掌握關(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 有兩個函數(shù),分別是 object() 和 array() 函數(shù),它們可以將自己轉(zhuǎn)換成 QJsonArray 類型或者 QJsonObject 類型
使用 object() 還是 array() 函數(shù)就看Json數(shù)據(jù)最開頭的是 方括號 還是 花括號 ,本文數(shù)據(jù)是方括號開頭,所以使用的是 array() 函數(shù)。
4.QJsonArray 的 at(int index) 函數(shù),用于訪問數(shù)組索引等于 index 的元素。
QJsonObject 的 value(const QString &key) 函數(shù),用于讀取花括號中的鍵值對的值。根據(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模塊實現(xiàn)解析Json文件的文章就介紹到這了,更多相關(guān)Qt QJson解析Json內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C/C++實現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換的多種方法
在C/C++程序中,會需要把數(shù)字與字符串做出互相轉(zhuǎn)換的操作,用于實現(xiàn)程序想要的效果,下面將介紹多種方法實現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下2024-08-08

