亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Qt使用QJson模塊實(shí)現(xiàn)解析Json文件

 更新時(shí)間:2023年10月20日 13:59:01   作者:海碼007  
在項(xiàng)目開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)遇到讀寫(xiě)Json文件的需求,掌握J(rèn)son文件的操作是基礎(chǔ)中的基礎(chǔ),下面我們就來(lái)看看如何使用QT內(nèi)置的QJson模塊解析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)文章

  • C語(yǔ)言中字符串常用操作總結(jié)

    C語(yǔ)言中字符串常用操作總結(jié)

    C語(yǔ)言是一種非常流行的編程語(yǔ)言,它支持各種數(shù)據(jù)類型,包括整數(shù)、浮點(diǎn)數(shù)、字符和字符串等,本文將介紹?C語(yǔ)言中字符串的相關(guān)知識(shí),包括字符串的定義、初始化、賦值等,需要的可以參考一下
    2023-05-05
  • QT6中QTextcodec頭文件找不到的解決方法

    QT6中QTextcodec頭文件找不到的解決方法

    本文主要介紹了QT6中QTextcodec頭文件找不到的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • visualstudio2022工程重命名的圖文步驟

    visualstudio2022工程重命名的圖文步驟

    很多時(shí)候需要用到項(xiàng)目重命名,本文主要介紹了visualstudio2022工程重命名的圖文步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • 淺談在函數(shù)中返回動(dòng)態(tài)的內(nèi)存

    淺談在函數(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-12
  • 詳解C語(yǔ)言未初始化的局部變量是多少

    詳解C語(yǔ)言未初始化的局部變量是多少

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言未初始化的局部變量是多少,文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • C++語(yǔ)言實(shí)現(xiàn)開(kāi)心消消樂(lè)

    C++語(yǔ)言實(shí)現(xiàn)開(kāi)心消消樂(lè)

    這篇文章主要為大家詳細(xì)介紹了C++語(yǔ)言實(shí)現(xiàn)開(kāi)心消消樂(lè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • c++算法進(jìn)階刪除有序鏈表中的重復(fù)元素

    c++算法進(jìn)階刪除有序鏈表中的重復(fù)元素

    這篇文章主要為大家介紹了c++算法進(jìn)階刪除有序鏈表中的重復(fù)元素示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • C++基礎(chǔ)知識(shí)之運(yùn)算符重載詳解

    C++基礎(chǔ)知識(shí)之運(yùn)算符重載詳解

    這篇文章主要為大家詳細(xì)介紹了C++基礎(chǔ)知識(shí)之運(yùn)算符重載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • C/C++實(shí)現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換的多種方法

    C/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-08
  • C++詳細(xì)講解互斥量與lock_guard類模板及死鎖

    C++詳細(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

最新評(píng)論