最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt服務(wù)應(yīng)用操作之JSON文件操作方法

 更新時(shí)間:2024年10月30日 09:33:32   作者:J^T  
在Qt框架中,處理JSON數(shù)據(jù)包括解析、生成、保存和讀取文件等操作,本文詳細(xì)介紹了這些操作的關(guān)鍵類和方法,如QJsonDocument、QJsonObject、QJsonArray等,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

引言

在Qt框架中,JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,易于人閱讀和編寫,同時(shí)也易于機(jī)器解析和生成。Qt提供了多個(gè)類來支持JSON的解析、生成、修改和序列化,使得在Qt應(yīng)用程序中處理JSON數(shù)據(jù)變得簡(jiǎn)單高效。本文將詳細(xì)介紹如何在Qt中操作JSON文件。

一、JSON基礎(chǔ)知識(shí)

JSON主要有兩種數(shù)據(jù)結(jié)構(gòu):JSON對(duì)象和JSON數(shù)組。

  • JSON對(duì)象:由鍵值對(duì)組成,每個(gè)鍵(key)是字符串,值(value)可以是字符串、數(shù)字、布爾值、null、JSON數(shù)組或JSON對(duì)象。對(duì)象以花括號(hào){}包裹,鍵值對(duì)之間用逗號(hào),分隔,鍵與值之間以冒號(hào):分隔。

    // 示例一:JSON對(duì)象
    {
        "name": "John Doe",
         "age": 30,
         "isEmployed": true
    }
  • JSON數(shù)組:一系列有序的值的集合,其元素可以是任何JSON類型,包括其他數(shù)組或?qū)ο蟆?shù)組以方括號(hào)[]包裹,元素之間用逗號(hào),分隔。

    // 示例二:JSON數(shù)組
    ["Apple", "Banana", {"id": 1, "color": "Red"}]

二、Qt中處理JSON的關(guān)鍵類

Qt中處理JSON數(shù)據(jù)主要涉及以下幾個(gè)類:

  • QJsonDocument:代表整個(gè)JSON文檔,負(fù)責(zé)從/向UTF-8文本或Qt內(nèi)部二進(jìn)制格式進(jìn)行序列化與反序列化。
  • QJsonObject:表示JSON對(duì)象,封裝了鍵值對(duì)的管理。
  • QJsonArray:表示JSON數(shù)組,實(shí)現(xiàn)了動(dòng)態(tài)大小的值列表。
  • QJsonValue:封裝了JSON支持的數(shù)據(jù)類型,包括字符串、數(shù)字、布爾值、null、對(duì)象和數(shù)組。
  • QJsonParseError:用于報(bào)告JSON解析中的錯(cuò)誤類型。
// 相關(guān)頭文件
#include <QFile>    // 文件操作
#include <QJsonObject>  // JSON對(duì)象
#include <QJsonArray>   // JSON數(shù)組
#include <QJsonDocument>    // JSON文檔
#include <QJsonParseError>  // JSON異常捕捉

三、生成JSON數(shù)據(jù)

在Qt中,可以通過組合使用上述類來創(chuàng)建復(fù)雜的JSON數(shù)據(jù)結(jié)構(gòu)。以下是一個(gè)示例函數(shù),展示如何創(chuàng)建一個(gè)包含嵌套對(duì)象和數(shù)組的JSON對(duì)象:

// 生成復(fù)雜JSON對(duì)象
QJsonObject createJSONObject() {
    QJsonObject personObject;  // JSON對(duì)象
    // 方式一:insert()方法
    personObject.insert("name","John Doe");
    personObject.insert("age", 30);
    personObject.insert("isEmployed", true);

    QJsonObject addressObject;
    // 方式二:賦值
    addressObject["street"] = "123 Main St.";
    addressObject["city"] = "Anytown";
    addressObject["country"] = "USA";
    personObject["address"] = addressObject;  // 嵌套JSON對(duì)象

    QJsonArray hobbiesArray;  // JSON數(shù)組
    hobbiesArray.append("Reading");
    hobbiesArray.append("Gaming");
    personObject["hobbies"] = hobbiesArray;  // 嵌套JSON數(shù)組

    return personObject;
}
// 運(yùn)行結(jié)果在文章末尾

四、解析JSON數(shù)據(jù)

給定一個(gè)JSON字符串,可以使用Qt的類將其解析為相應(yīng)的對(duì)象或數(shù)組結(jié)構(gòu)。以下是一個(gè)解析JSON字符串的示例:

// 解析JSON對(duì)象
QString parseAndPrintJSON(const QString &jsonString) {
    QString strtemp;    // 解析后的內(nèi)容
    QJsonParseError error;  // 返回JSON解析錯(cuò)誤的時(shí)候,報(bào)告錯(cuò)誤信息
    QJsonDocument document = QJsonDocument::fromJson(jsonString.toUtf8(), &error);
    if (error.error != QJsonParseError::NoError) {
        qCritical() << "JSON parsing error: " << error.errorString();
        return NULL;
    }
    // 檢查保存的值是否是對(duì)象
    if (document.isObject()) {
        QJsonObject object = document.object(); // 將它轉(zhuǎn)換為JSON對(duì)象
        for (auto it = object.begin(); it != object.end(); ++it) { 
            const QString key = it.key();
            strtemp += "\nKey: " + key;
            qDebug() << "Key:" << key;
            // 此處可根據(jù)自己需求進(jìn)一步處理
        }
    }
    return strtemp;
}

五、保存JSON數(shù)據(jù)到文件

要將JSON數(shù)據(jù)保存到文件中,你可以使用QFileQTextStream(或QDataStream,但通常對(duì)于文本數(shù)據(jù),QTextStream更合適)。首先,你需要將QJsonDocument對(duì)象序列化為QByteArray,然后將其寫入文件。

// 保存JSON數(shù)據(jù)到文件
void saveJsonToFile(const QString &fileName, const QJsonObject &person) {
    // 創(chuàng)建JSON文檔
    QJsonDocument doc(person);

    QFile file(fileName);
    // 若文件打開失敗,異常處理
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        qCritical() << "無法打開"<< fileName << "文件進(jìn)行寫入" ;
        return;
    }
    /*
    若使用QTextStream,需包含頭文件"QTextStream"
    QTextStream out(&file);
    out << doc.toJson(QJsonDocument::Indented);
    */
    // 這里使用QFile
    file.write(doc.toJson(QJsonDocument::Indented)); // 使用縮進(jìn)格式使其更易于閱讀
    file.close();
}

在上面示例函數(shù)中,我們使用了QJsonDocument::Indented選項(xiàng)來生成格式化的JSON字符串,這使得文件內(nèi)容更易于人類閱讀。然而,如果你關(guān)心文件大小或性能,可以選擇不使用縮進(jìn)(即省略QJsonDocument::Indented參數(shù))。

六、從文件讀取JSON數(shù)據(jù)

從文件讀取JSON數(shù)據(jù)是上述保存過程的逆過程,使用QFileQTextStream讀取文件內(nèi)容,然后使用QJsonDocument::fromJson方法解析JSON字符串,。

// 讀取文件數(shù)據(jù)
QString loadJsonFromFile(const QString &fileName) {  
    QFile file(fileName);  
    // 若文件打開失敗,異常處理
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {  
        qCritical() << "無法打開"<< fileName << "文件進(jìn)行讀取";  
        return NULL;  
    }  
  
    /*
    若使用QTextStream,需包含頭文件"QTextStream"
    QTextStream in(&file);  
    QString jsonString = in.readAll();
    */  
    QString jsonString = file.readAll(); // 讀取全部?jī)?nèi)容
    file.close();  // 關(guān)閉文件
  
    return jsonString; // 返回讀取內(nèi)容,注意:此處內(nèi)容未解析,可以和上述的解析函數(shù)結(jié)合使用
} 

七、代碼及運(yùn)行結(jié)果

1. UI測(cè)試界面

2. 代碼示例

  • qjsonoper.h
#ifndef QJSONOPER_H
#define QJSONOPER_H

#include <QDialog>

QT_BEGIN_NAMESPACE
namespace Ui { class QJsonOper; }
QT_END_NAMESPACE

class QJsonOper : public QDialog
{
    Q_OBJECT

public:
    QJsonOper(QWidget *parent = nullptr);
    ~QJsonOper();



private slots:
    void on_wJsonBtn_clicked(); // 將數(shù)據(jù)信息寫入JSON文件槽函數(shù)

    void on_rJsonBtn_clicked();// 讀取JSON文件數(shù)據(jù)槽函數(shù)

private:
    Ui::QJsonOper *ui;
};
#endif // QJSONOPER_H
  • qjsonoper.cpp
#include "qjsonoper.h"
#include "ui_qjsonoper.h"

#include <QMessageBox>
#include <QDebug>

#include <QFile>    // 文件操作

#include <QJsonObject>  // JSON對(duì)象
#include <QJsonArray>   // JSON數(shù)組
#include <QJsonDocument>    // JSON文檔
#include <QJsonParseError>  // JSON異常捕捉

QJsonOper::QJsonOper(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::QJsonOper)
{
    ui->setupUi(this);
}

QJsonOper::~QJsonOper()
{
    delete ui;
}

// 1. 生成復(fù)雜JSON對(duì)象
QJsonObject createJSONObject() {
    QJsonObject personObject;  // JSON對(duì)象
    // 方式一:insert()方法
    personObject.insert("name","John Doe");
    personObject.insert("age", 30);
    personObject.insert("isEmployed", true);

    QJsonObject addressObject;
    // 方式二:賦值
    addressObject["street"] = "123 Main St.";
    addressObject["city"] = "Anytown";
    addressObject["country"] = "USA";
    personObject["address"] = addressObject;  // 嵌套JSON對(duì)象

    QJsonArray hobbiesArray;  // JSON數(shù)組
    hobbiesArray.append("Reading");
    hobbiesArray.append("Gaming");
    personObject["hobbies"] = hobbiesArray;  // 嵌套JSON數(shù)組

    return personObject;
}

// 2. 解析JSON對(duì)象
QString parseAndPrintJSON(const QString &jsonString) {
    QString strtemp;    // 解析后的內(nèi)容
    QJsonParseError error;  // 返回JSON解析錯(cuò)誤的時(shí)候,報(bào)告錯(cuò)誤信息
    QJsonDocument document = QJsonDocument::fromJson(jsonString.toUtf8(), &error);
    if (error.error != QJsonParseError::NoError) {
        qCritical() << "JSON parsing error: " << error.errorString();
        return NULL;
    }
    // 檢查保存的值是否是對(duì)象
    if (document.isObject()) {
        QJsonObject object = document.object(); // 將它轉(zhuǎn)換為JSON對(duì)象
        QStringList keys = object.keys(); //得到所有key
        /*for (auto it = object.begin(); it != object.end(); ++it) {
            const QString key = it.key();
            strtemp += "\nKey: " + key;
            qDebug() << "Key:" << key;
            // 此處可根據(jù)自己需求進(jìn)一步處理
        }*/
        for (int i = 0; i < keys.size(); i++) // 遍歷每一個(gè)鍵值
        {
            QString key = keys.at(i);
            QJsonValue value = object.value(key);
            if (value.isBool())
            {
                strtemp += key + ":" + value.toBool() + "\n";
            }
            else if (value.isString())
            {
                strtemp += key + ":" + value.toString() + "\n";
            }
            else if (value.isDouble())
            {
                strtemp += key + ":" + value.toDouble() + "\n";
            }
            else if (value.isArray())
            {
                strtemp += keys.at(i) + ":" + "\n";
                QJsonArray array = value.toArray();
                for (int j = 0; j < array.size(); j++)
                {
                    strtemp += "    " + array[j].toString() + "\n";
                }
            }
            else if (value.isObject())
            {
                strtemp += key + ":" + "\n";
                QJsonObject subObj = value.toObject();
                QStringList subKeys = subObj.keys();
                for(int k = 0; k < subKeys.size(); ++k)
                {
                    QJsonValue subValue = subObj.value(subKeys.at(k));
                    if (subValue.isString())
                    {
                        strtemp += "   " + subKeys.at(k) + ":" + subValue.toString() + "\n";
                    }

                    else if (subValue.isArray())
                    {
                        strtemp += subKeys.at(k) + ":" + "\n";
                        QJsonArray array = subValue.toArray();
                        for (int m = 0; m < array.size(); m++)
                        {
                            strtemp += "     " + array[m].toString() + "\n";
                        }
                    }
                }
            }
        }
    }
    return strtemp;
}

// 3. 保存JSON數(shù)據(jù)到文件
void saveJsonToFile(const QString &fileName, const QJsonObject &person) {
    // 創(chuàng)建JSON文檔
    QJsonDocument doc(person);

    QFile file(fileName);
    // 若文件打開失敗,異常處理
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        qCritical() << "無法打開"<< fileName << "文件進(jìn)行寫入" ;
        return;
    }
    /*
    若使用QTextStream
    QTextStream out(&file);
    out << doc.toJson(QJsonDocument::Indented);
    */
    // 這里使用QFile
    file.write(doc.toJson(QJsonDocument::Indented)); // 使用縮進(jìn)格式使其更易于閱讀
    file.close();
}

// 4. 讀取文件數(shù)據(jù)
QString loadJsonFromFile(const QString &fileName) {
    QFile file(fileName);
    // 若文件打開失敗,異常處理
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qCritical() << "無法打開"<< fileName << "文件進(jìn)行讀取";
        return NULL;
    }

    /*
    若使用QTextStream,需包含頭文件"QTextStream"
    QTextStream in(&file);
    QString jsonString = in.readAll();
    */
    QString jsonString = file.readAll(); // 讀取全部?jī)?nèi)容
    file.close();  // 關(guān)閉文件

    return jsonString; // 返回讀取內(nèi)容,注意:此處內(nèi)容未解析,可以和上述的解析函數(shù)結(jié)合使用
}


// 將數(shù)據(jù)信息寫入JSON文件槽函數(shù)
void QJsonOper::on_wJsonBtn_clicked()
{
    // 生成JSON對(duì)象
    QJsonObject person = createJSONObject();

    // 保存JSON數(shù)據(jù)到文件
    saveJsonToFile("person.json", person);

    // 若保存成功,對(duì)話框彈出
    QMessageBox::information(this,"success", "恭喜你!成功保存JSON數(shù)據(jù)到文件!");
}

// 讀取JSON文件數(shù)據(jù)槽函數(shù)
void QJsonOper::on_rJsonBtn_clicked()
{
    QString fileName = "person.json";
    // 讀取JSON文件數(shù)據(jù),注意未解析
    QString jsonString = loadJsonFromFile(fileName);

    // 解析JSON對(duì)象
    QString str = parseAndPrintJSON(jsonString);

    // 若讀取成功,對(duì)話框彈出
    QMessageBox::information(this,fileName, str, QMessageBox::Yes);
}
  • main.cpp
#include "qjsonoper.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QJsonOper w;
    w.show();
    return a.exec();
}

3. 運(yùn)行結(jié)果

  • 點(diǎn)擊:寫入JSON文件信息

        查看person.json文件:

  • 點(diǎn)擊:讀取JSON文件信息

八、總結(jié)

在Qt中處理JSON數(shù)據(jù)是一個(gè)常見且重要的任務(wù),特別是在需要與Web服務(wù)、配置文件或其他基于JSON的數(shù)據(jù)源進(jìn)行交互的應(yīng)用程序中。通過本文的講解,我們了解了在Qt中處理JSON數(shù)據(jù)的幾個(gè)關(guān)鍵步驟,包括生成JSON數(shù)據(jù)、解析JSON字符串、遍歷JSON對(duì)象和數(shù)組、以及將JSON數(shù)據(jù)保存到文件和從文件讀取JSON數(shù)據(jù)。

  • 生成JSON數(shù)據(jù)
    我們使用QJsonObjectQJsonArray來構(gòu)建JSON對(duì)象和數(shù)組。QJsonObject用于存儲(chǔ)鍵值對(duì),而QJsonArray則用于存儲(chǔ)值的數(shù)組。通過將這些對(duì)象組合起來,我們可以構(gòu)建復(fù)雜的JSON結(jié)構(gòu)。

  • 解析JSON字符串
    使用QJsonDocument::fromJson()方法將JSON格式的字符串解析為QJsonDocument對(duì)象。如果解析成功,我們可以進(jìn)一步將QJsonDocument對(duì)象轉(zhuǎn)換為QJsonObjectQJsonArray,以便訪問JSON數(shù)據(jù)。

  • 遍歷JSON對(duì)象和數(shù)組
    對(duì)于QJsonObject,我們可以使用value()方法來訪問其鍵值對(duì)。對(duì)于QJsonArray,我們可以使用迭代器或索引來遍歷其元素。每個(gè)元素可以是另一個(gè)QJsonObjectQJsonArray或基本數(shù)據(jù)類型的值。

  • 保存JSON數(shù)據(jù)到文件
    QJsonDocument對(duì)象轉(zhuǎn)換為QByteArray,然后使用QFileQTextStream(或QDataStream,但通常對(duì)于文本數(shù)據(jù),QTextStream更合適)將字節(jié)數(shù)組寫入文件。我們可以使用QJsonDocument::toJson()方法,并可選地指定縮進(jìn),以生成易于閱讀的JSON格式。

  • 從文件讀取JSON數(shù)據(jù)
    使用QFileQTextStream(或QDataStream)從文件讀取JSON字符串,然后使用QJsonDocument::fromJson()方法將其解析為QJsonDocument對(duì)象。

  • 錯(cuò)誤處理
    在解析JSON字符串和打開文件時(shí),我們始終應(yīng)該檢查是否發(fā)生了錯(cuò)誤,并適當(dāng)?shù)靥幚硭鼈儭@?,如果JSON字符串格式不正確或文件無法打開,我們應(yīng)該向用戶報(bào)告錯(cuò)誤并可能采取恢復(fù)措施。

通過掌握這些基本技能,你可以在Qt應(yīng)用程序中有效地使用JSON數(shù)據(jù),無論是用于配置管理、網(wǎng)絡(luò)通信還是數(shù)據(jù)持久化。JSON的靈活性、易用性和普及性使其成為許多現(xiàn)代應(yīng)用程序中數(shù)據(jù)交換的首選格式。

到此這篇關(guān)于Qt服務(wù)應(yīng)用操作之JSON文件操作方法的文章就介紹到這了,更多相關(guān)Qt JSON文件操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 最新C語言中g(shù)etchar的使用

    最新C語言中g(shù)etchar的使用

    getchar()是在輸入緩沖區(qū)順序讀入一個(gè)字符(包括空格、回車和Tab) ,getchar()是stdio.h中的庫函數(shù),它的作用是從stdin流中讀入一個(gè)字符,本文給大家介紹getchar的使用,感興趣的朋友跟隨小編一起看看吧
    2022-12-12
  • 淺談c語言中一種典型的排列組合算法

    淺談c語言中一種典型的排列組合算法

    下面小編就為大家?guī)硪黄獪\談c語言中一種典型的排列組合算法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • VisualStudio中OpenCV的創(chuàng)建與配置使用小結(jié)

    VisualStudio中OpenCV的創(chuàng)建與配置使用小結(jié)

    本文介紹了OpenCV在Visual Studio中的配置步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • C++ 淺談emplace_back及使用誤區(qū)

    C++ 淺談emplace_back及使用誤區(qū)

    這篇文章主要介紹了C++ 淺談emplace_back及使用誤區(qū),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C++中關(guān)于多態(tài)實(shí)現(xiàn)和使用方法

    C++中關(guān)于多態(tài)實(shí)現(xiàn)和使用方法

    這篇文章主要介紹了C++中關(guān)于多態(tài)實(shí)現(xiàn)和使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C語言超全面覆蓋操作符知識(shí)點(diǎn)

    C語言超全面覆蓋操作符知識(shí)點(diǎn)

    C?語言提供了豐富的操作符,有:算術(shù)操作符,移位操作符,位操作符,賦值操作符,單目操作符,關(guān)系操作符,邏輯操作符,條件操作符等。讓我們通讀本篇來詳細(xì)了解吧
    2022-06-06
  • C++ 情懷游戲貪吃蛇的實(shí)現(xiàn)流程詳解

    C++ 情懷游戲貪吃蛇的實(shí)現(xiàn)流程詳解

    貪吃蛇是曾經(jīng)諾基亞手機(jī)上很經(jīng)典很經(jīng)典的傳統(tǒng)老游戲,80.90后的童年時(shí)不多的游戲之一,跟電腦上的掃雷一樣,下面來從貪吃蛇手機(jī)游戲的前世今生講起
    2021-11-11
  • C語言中的數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換

    C語言中的數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換

    這篇文章主要介紹了C語言中的數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • C++右移運(yùn)算符的一個(gè)小坑及解決

    C++右移運(yùn)算符的一個(gè)小坑及解決

    文章指出右移運(yùn)算符處理負(fù)數(shù)時(shí)左側(cè)補(bǔ)1導(dǎo)致死循環(huán),與除法行為不同,強(qiáng)調(diào)需注意補(bǔ)碼機(jī)制以正確統(tǒng)計(jì)二進(jìn)制1的個(gè)數(shù)
    2025-09-09
  • C語言基礎(chǔ)知識(shí)變量的作用域和存儲(chǔ)方式詳細(xì)介紹

    C語言基礎(chǔ)知識(shí)變量的作用域和存儲(chǔ)方式詳細(xì)介紹

    這篇文章主要介紹了C語言基礎(chǔ)知識(shí)變量的作用域和存儲(chǔ)方式詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-01-01

最新評(píng)論

泰州市| 闵行区| 苗栗县| 英山县| 福泉市| 康乐县| 大港区| 英山县| 通海县| 阳春市| 民和| 敦化市| 长汀县| 新疆| 福安市| 奉贤区| 开远市| 东宁县| 山东| 隆尧县| 财经| 惠东县| 太仆寺旗| 呼伦贝尔市| 乌鲁木齐县| 遵义县| 津南区| 四川省| 大埔区| 儋州市| 兴和县| 汉中市| 益阳市| 虹口区| 兴国县| 西宁市| 延寿县| 定西市| 密山市| 榆社县| 泸溪县|