天天看點

Qt實作json解析

作者:QT進階進階

前提要點

json檔案,可通過鍵值的方式存儲你所需要的資料,斌且支援多種類型存儲,類似于一種結構化的資料庫,在讀取json檔案時可通過相對應的關鍵字精準擷取。他是一種樹狀結構,我們可以自己設定葉子的數量以及他所代表的寓意,指定每一個葉子的父親,以及父親的父親......

1. 首先擷取位址 讀取json檔案

```js
QFile file(QString::fromStdString(json));
bool bOpen = file.open(QIODevice::ReadOnly);
if (bOpen == false)
{
return item;
}
QByteArray data = file.readAll();
file.close();

```           

讀取json檔案 那一定要知道他的位置,通過位置理由QFile庫 将檔案打開`QIODevice::ReadOnly`設定檔案為僅讀取模式,如果設為可讀可寫,在後面的處理資料中,以防檔案被中途修改。

2. 将資料轉化為json可讀

2.1、首先

```js
QJsonDocument doc = QJsonDocument::fromJson(data);//讀寫json文檔
if (!doc.isObject())
{
return item;
}
```           

利用Qt自帶庫 擷取json内容 `QJsonDocument::fromJson(data)` 判斷是否為引用類型

2.2、顯示關鍵字所對應的内容

```
QStringList keys = obj.keys();
for(int i=0;i<keys.size();i++)
{
qDebug() << "key" << i << " is:" << keys.at(i);
}

```           

此方法是通過關鍵字的位置來擷取關鍵字的内容,接下來将會使用另外一種方法:利用關鍵字讀取相對應的内容。

2.3、json檔案讀取的不同方式,以及他的類型

第一種json格式

json檔案 内容:

```
{
"optionA": "aaa",
"optionB": "bbbb",
"score": 3
}
```
           

解析代碼:

```
QJsonObject obj = doc.object();//封裝json對象
item.content = obj["content"].toString().toStdString();
item.optionA = obj["optionA"].toString().toStdString();
item.optionB = obj["optionB"].toString().toStdString();
item.score = obj["score"].toInt();//int 類型 直接toint 不用轉為字元串

```           

以上執行個體可發現,json主要是由關鍵字與所對應值構成,斌給有其他别的類型,可以直接解析。QJsonObject是封裝一個json對象,可通過這個對象,使用以上方法來擷取關鍵字的内容。

【文章福利】Qt開發學習資料包、大廠面試題、技術視訊和學習路線圖,包括(Qt C++基礎,資料庫程式設計,Qt項目實戰、Qt架構、qt線程等等)有需要的可以進企鵝裙661714027領取哦~

(注:["content"]所對應的内容一定要是與json檔案中的關鍵字相同,否則解析成功)

第二種json格式

json檔案 内容:

```
{
"optionA": "aaa",
"optionB": "bbbb",
"score": 3
}
```           

解析代碼:

```
QJsonObject obj = doc.object();//封裝json對象
item.content = obj["content"].toString().toStdString();
item.optionA = obj["optionA"].toString().toStdString();
item.optionB = obj["optionB"].toString().toStdString();
item.score = obj["score"].toInt();//int 類型 直接toint 不用轉為字元串

```           

以上執行個體可發現,json

主要是由關鍵字與所對應值構成,斌給有其他别的類型,可以直接解析。QJsonObject是封裝一個json對象,可通過這個對象,使用以上方法來擷取關鍵字的内容。

(注:["content"]所對應的内容一定要是與json檔案中的關鍵字相同,否則解析成功)

第二種json格式

json檔案 内容:

```
"questinList": [{
"optionA": "aaa",
"optionB": "bbbb",
}, {
"optionA": "aaa",
"optionB": "bbbb",
}]

```           

解析代碼:

```
QJsonArray questinlist = root["questinlist"].toArray();
for(int i = 0; i < questinlist.count(); i++)
{
QJsonObject obj = questinlist.at(i).toObject();
item.content = obj["content"].toString().toStdString();
item.optionA = obj["optionA"].toString().toStdString();
item.optionB = obj["optionB"].toString().toStdString();
data.questinList.push_back(item);
}


```           

可通過json檔案發現 questinList是一個list 它内部存儲了許多的同樣類型的資料組,就像是一個媽媽與她的孩子們,他的孩子們都擁有一樣的基因,就是他們都擁有一樣的關鍵字,但是每個人又有所不懂,是以他們的關鍵字所對應的資料不一定全都一樣。一個媽媽就是一個Array,通過擷取媽媽孩子的數量,将每個孩子帶出來,然後轉移到另一個存儲他們的房子裡。