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

C/C++?Qt?運(yùn)用JSON解析庫(kù)的實(shí)例代碼

 更新時(shí)間:2022年01月06日 10:52:59   作者:lyshark  
這篇文章主要介紹了C/C++?Qt?運(yùn)用JSON解析庫(kù)的相關(guān)知識(shí),通過(guò)代碼依次解析這個(gè)json文件中的每一個(gè)參數(shù),代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

JSON是一種簡(jiǎn)單的輕量級(jí)數(shù)據(jù)交換格式,Qt庫(kù)為JSON的相關(guān)操作提供了完整的類支持,使用JSON解析文件之前需要先通過(guò)TextStream流將文件讀入到字符串變量?jī)?nèi),然后再通過(guò)QJsonDocument等庫(kù)對(duì)該JSON格式進(jìn)行解析,以提取出我們所需字段。

首先創(chuàng)建一個(gè)解析文件,命名為config.json我們將通過(guò)代碼依次解析這個(gè)JSON文件中的每一個(gè)參數(shù),具體解析代碼如下:

{
    "blog": "https://www.cnblogs.com/lyshark",
    "enable": true,
    "status": 1024,
    
    "GetDict": {"address":"192.168.1.1","username":"root","password":"123456","update":"2020-09-26"},
    "GetList": [1,2,3,4,5,6,7,8,9,0],
    
    "ObjectInArrayJson":
    {
        "One": ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],
        "Two": ["Sunday","Monday","Tuesday"]
    },
    
    "ArrayJson": [
        ["192.168.1.1","root","22"],
        ["192.168.1.2","root","23"],
        ["192.168.1.3","root","24"],
        ["192.168.1.4","root","25"],
        ["192.168.1.5","root","26"]
    ],
    
    "ObjectJson": [
        {"address":"192.168.1.1","username":"admin"},
        {"address":"192.168.1.2","username":"root"},
        {"address":"192.168.1.3","username":"lyshark"}
    ]
}

首先實(shí)現(xiàn)讀寫文本文件,通過(guò)QT中封裝的<QFile>庫(kù)可實(shí)現(xiàn)對(duì)文本文件的讀取操作,讀取JSON文件可使用該方式.

#include <QCoreApplication>
#include <iostream>
#include <QString>
#include <QTextStream>
#include <QFile>
#include <QDir>
#include <QFileInfo>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QJsonValueRef>
// 傳入文本路徑,讀取并輸出
int readonly_string_file(QString file_path)
{
    QFile this_file_ptr(file_path);
    // 判斷文件是否存在
    if(false == this_file_ptr.exists())
    {
        std::cout << "文件不存在" << std::endl;
        return 0;
    }
    /*
     * 文件打開(kāi)屬性包括如下
     * QIODevice::ReadOnly  只讀方式打開(kāi)
     * QIODevice::WriteOnly 寫入方式打開(kāi)
     * QIODevice::ReadWrite 讀寫方式打開(kāi)
     * QIODevice::Append    追加方式打開(kāi)
     * QIODevice::Truncate  截取方式打開(kāi)
     * QIODevice::Text      文本方式打開(kāi)
     */
    if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        std::cout << "打開(kāi)失敗" << std::endl;
        return 0;
    }
    // 讀取到文本中的字符串
    QString string_value = this_file_ptr.readAll();
    std::cout << "讀入長(zhǎng)度: " << this_file_ptr.size() << std::endl;
    std::cout << "字符串: " << string_value.toStdString() << std::endl;
    this_file_ptr.close();
}
// 逐行讀取文本文件
// PowerBy: www.cnblogs.com/lyshark
void read_line_file()
{
    QFile this_file_ptr("d:/config.json");
    if(this_file_ptr.open((QIODevice::ReadOnly | QIODevice::Text)))
    {
        QByteArray byte_array;
        while(false == this_file_ptr.atEnd())
        {
            byte_array += this_file_ptr.readLine();
        }
        std::cout << "完整文本: " << QString(byte_array).toStdString() << std::endl;
        this_file_ptr.close();
    }
}
// 傳入文本路徑與寫入內(nèi)容,寫入到文件
void write_string_file(QString file_path, QString string_value)
{
    QFile this_file_ptr(file_path);
    // 判斷文件是否存在
    if(false == this_file_ptr.exists())
    {
        return;
    }
    // 打開(kāi)失敗
    if(false == this_file_ptr.open(QIODevice::ReadWrite | QIODevice::Text))
    {
        return;
    }
    //寫入內(nèi)容,注意需要轉(zhuǎn)碼,否則會(huì)報(bào)錯(cuò)
    QByteArray write_string = string_value.toUtf8();
    //寫入QByteArray格式字符串
    this_file_ptr.write(write_string);
    this_file_ptr.close();
}
// 計(jì)算文件或目錄大小
// PowerBy: www.cnblogs.com/lyshark
unsigned int GetFileSize(QString path)
{
    QFileInfo info(path);
    unsigned int ret = 0;
    if(info.isFile())
    {
        ret = info.size();
    }
    else if(info.isDir())
    {
        QDir dir(path);
        QFileInfoList list = dir.entryInfoList();
        for(int i = 0; i < list.count(); i++)
        {
            if((list[i].fileName() != ".") && (list[i].fileName() != ".."))
            {
                ret += GetFileSize(list[i].absoluteFilePath());
            }
        }
    }
    return ret;
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    // 讀取文件
    readonly_string_file("d:/config.json");
    // 計(jì)算文件或目錄大小
    unsigned int file_size = GetFileSize("d:/xunjian");
    std::cout << "獲取文件或目錄大小: " << file_size << std::endl;
    // 覆蓋寫入文件
    QString write_file_path = "d:/test.json";
    QString write_string = "hello lyshark";
    write_string_file(write_file_path,write_string);
    return a.exec();
}

實(shí)現(xiàn)解析根對(duì)象中的單一鍵值對(duì),例如解析配置文件中的blog,enable,status等這些獨(dú)立的字段值.

// 讀取JSON文本
// PowerBy: www.cnblogs.com/lyshark
QString readonly_string(QString file_path)
{
    QFile this_file_ptr(file_path);
    if(false == this_file_ptr.exists())
    {
        return "None";
    }
    if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        return "None";
    }
    QString string_value = this_file_ptr.readAll();
    this_file_ptr.close();
    return string_value;
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    // 讀取文件
    QString config = readonly_string("d:/config.json");
    if(config == "None")
    {
        return 0;
    }
    // 字符串格式化為JSON
    QJsonParseError err_rpt;
    QJsonDocument  root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
    if(err_rpt.error != QJsonParseError::NoError)
    {
        std::cout << "JSON格式錯(cuò)誤" << std::endl;
        return 0;
    }
    // 獲取到Json字符串的根節(jié)點(diǎn)
    QJsonObject root_object = root_document.object();
    // 解析blog字段
    QString blog = root_object.find("blog").value().toString();
    std::cout << "字段對(duì)應(yīng)的值 = > "<< blog.toStdString() << std::endl;
    // 解析enable字段
    bool enable = root_object.find("enable").value().toBool();
    std::cout << "是否開(kāi)啟狀態(tài): " << enable << std::endl;
    // 解析status字段
    int status = root_object.find("status").value().toInt();
    std::cout << "狀態(tài)數(shù)值: " << status << std::endl;
    return a.exec();
}

實(shí)現(xiàn)解析簡(jiǎn)單的單對(duì)象單數(shù)組結(jié)構(gòu),如上配置文件中的GetDictGetList既是我們需要解析的內(nèi)容.

// 讀取JSON文本
QString readonly_string(QString file_path)
{
    QFile this_file_ptr(file_path);
    if(false == this_file_ptr.exists())
    {
        return "None";
    }
    if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        return "None";
    }
    QString string_value = this_file_ptr.readAll();
    this_file_ptr.close();
    return string_value;
}
// PowerBy: www.cnblogs.com/lyshark
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    // 讀取文件
    QString config = readonly_string("d:/config.json");
    if(config == "None")
    {
        return 0;
    }
    // 字符串格式化為JSON
    QJsonParseError err_rpt;
    QJsonDocument  root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
    if(err_rpt.error != QJsonParseError::NoError)
    {
        std::cout << "JSON格式錯(cuò)誤" << std::endl;
        return 0;
    }
    // 獲取到Json字符串的根節(jié)點(diǎn)
    QJsonObject root_object = root_document.object();
    // 解析單一對(duì)象
    // PowerBy: www.cnblogs.com/lyshark
    QJsonObject get_dict_ptr = root_object.find("GetDict").value().toObject();
    QVariantMap map = get_dict_ptr.toVariantMap();
    if(map.contains("address") && map.contains("username") && map.contains("password") && map.contains("update"))
    {
        QString address = map["address"].toString();
        QString username = map["username"].toString();
        QString password = map["password"].toString();
        QString update = map["update"].toString();
        std::cout
                  << " 地址: " << address.toStdString()
                  << " 用戶名: " << username.toStdString()
                  << " 密碼: " << password.toStdString()
                  << " 更新日期: " << update.toStdString()
                  << std::endl;
    }
    // 解析單一數(shù)組
    QJsonArray get_list_ptr = root_object.find("GetList").value().toArray();
    for(int index=0; index < get_list_ptr.count(); index++)
    {
        int ref_value = get_list_ptr.at(index).toInt();
        std::cout << "輸出數(shù)組元素: " << ref_value << std::endl;
    }
    return a.exec();
}

實(shí)現(xiàn)解析對(duì)象嵌套對(duì)象對(duì)象中嵌套數(shù)組結(jié)構(gòu),如上配置文件中的ObjectInArrayJson既是我們需要解析的內(nèi)容.

// 讀取JSON文本
QString readonly_string(QString file_path)
{
    QFile this_file_ptr(file_path);
    if(false == this_file_ptr.exists())
    {
        return "None";
    }
    if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        return "None";
    }
    QString string_value = this_file_ptr.readAll();
    this_file_ptr.close();
    return string_value;
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    // 讀取文件
    QString config = readonly_string("d:/config.json");
    if(config == "None")
    {
        return 0;
    }
    // 字符串格式化為JSON
    // PowerBy: www.cnblogs.com/lyshark
    QJsonParseError err_rpt;
    QJsonDocument  root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
    if(err_rpt.error != QJsonParseError::NoError)
    {
        std::cout << "JSON格式錯(cuò)誤" << std::endl;
        return 0;
    }
    // 獲取到Json字符串的根節(jié)點(diǎn)
    QJsonObject root_object = root_document.object();
    // 找到Object對(duì)象
    QJsonObject one_object_json = root_object.find("ObjectInArrayJson").value().toObject();
    // 轉(zhuǎn)為MAP映射
    QVariantMap map = one_object_json.toVariantMap();
    // 尋找One鍵
    QJsonArray array_one = map["One"].toJsonArray();
    for(int index=0; index < array_one.count(); index++)
    {
        QString value = array_one.at(index).toString();
        std::cout << "One => "<< value.toStdString() << std::endl;
    }
    // 尋找Two鍵
    QJsonArray array_two = map["Two"].toJsonArray();
    for(int index=0; index < array_two.count(); index++)
    {
        QString value = array_two.at(index).toString();
        std::cout << "Two => "<< value.toStdString() << std::endl;
    }
    return a.exec();
}

實(shí)現(xiàn)解析數(shù)組中的數(shù)組結(jié)構(gòu),如上配置文件中的ArrayJson既是我們需要解析的內(nèi)容.

// 讀取JSON文本
// PowerBy: www.cnblogs.com/lyshark
QString readonly_string(QString file_path)
{
    QFile this_file_ptr(file_path);
    if(false == this_file_ptr.exists())
    {
        return "None";
    }
    if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        return "None";
    }
    QString string_value = this_file_ptr.readAll();
    this_file_ptr.close();
    return string_value;
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    // 讀取文件
    QString config = readonly_string("d:/config.json");
    if(config == "None")
    {
        return 0;
    }
    // 字符串格式化為JSON
    QJsonParseError err_rpt;
    QJsonDocument  root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
    if(err_rpt.error != QJsonParseError::NoError)
    {
        std::cout << "json 格式錯(cuò)誤" << std::endl;
        return 0;
    }
    // 獲取到Json字符串的根節(jié)點(diǎn)
    QJsonObject root_object = root_document.object();
    // 獲取MyJson數(shù)組
    QJsonValue array_value = root_object.value("ArrayJson");
    // 驗(yàn)證節(jié)點(diǎn)是否為數(shù)組
    if(array_value.isArray())
    {
        // 得到數(shù)組個(gè)數(shù)
        int array_count = array_value.toArray().count();
        // 循環(huán)數(shù)組個(gè)數(shù)
        for(int index=0;index <= array_count;index++)
        {
            QJsonValue parset = array_value.toArray().at((index));
            if(parset.isArray())
            {
                QString address = parset.toArray().at(0).toString();
                QString username = parset.toArray().at(1).toString();
                QString userport = parset.toArray().at(2).toString();
                std::cout
                        << "地址: " << address.toStdString()
                        << " 用戶名: " << username.toStdString()
                        << " 端口號(hào): " << userport.toStdString()
                << std::endl;
            }
        }
    }
    return a.exec();
}

實(shí)現(xiàn)解析數(shù)組中的多對(duì)象結(jié)構(gòu),如上配置文件中的ObjectJson既是我們需要解析的內(nèi)容.

// 讀取JSON文本
// PowerBy: www.cnblogs.com/lyshark
QString readonly_string(QString file_path)
{
    QFile this_file_ptr(file_path);
    if(false == this_file_ptr.exists())
    {
        return "None";
    }
    if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        return "None";
    }
    QString string_value = this_file_ptr.readAll();
    this_file_ptr.close();
    return string_value;
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    // 讀取文件
    QString config = readonly_string("d:/config.json");
    if(config == "None")
    {
        return 0;
    }
    // 字符串格式化為JSON
    QJsonParseError err_rpt;
    QJsonDocument  root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
    if(err_rpt.error != QJsonParseError::NoError)
    {
        std::cout << "json 格式錯(cuò)誤" << std::endl;
        return 0;
    }
    // 獲取到Json字符串的根節(jié)點(diǎn)
    QJsonObject root_object = root_document.object();
    // 獲取MyJson數(shù)組
    QJsonValue object_value = root_object.value("ObjectJson");
    // 驗(yàn)證是否為數(shù)組
    // PowerBy: www.cnblogs.com/lyshark
    if(object_value.isArray())
    {
        // 獲取對(duì)象個(gè)數(shù)
        int object_count = object_value.toArray().count();
        // 循環(huán)個(gè)數(shù)
        for(int index=0;index <= object_count;index++)
        {
            QJsonObject obj = object_value.toArray().at(index).toObject();
            // 驗(yàn)證數(shù)組不為空
            if(!obj.isEmpty())
            {
                QString address = obj.value("address").toString();
                QString username = obj.value("username").toString();
                std::cout << "地址: " << address.toStdString() << " 用戶: " << username.toStdString() << std::endl;
            }
        }
    }
    return a.exec();
}

到此這篇關(guān)于C/C++ Qt 運(yùn)用JSON解析庫(kù)的實(shí)例代碼的文章就介紹到這了,更多相關(guān)C++ Qt  JSON解析庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 為什么說(shuō)C語(yǔ)言是永不過(guò)時(shí)的語(yǔ)言

    為什么說(shuō)C語(yǔ)言是永不過(guò)時(shí)的語(yǔ)言

    時(shí)隔5年,C語(yǔ)言再次領(lǐng)先Java,榮登TIOBE編程語(yǔ)言排行榜第一,那么C語(yǔ)言為何不會(huì)過(guò)時(shí)?你需要掌握多少種語(yǔ)言呢,感興趣的朋友通過(guò)本文一起學(xué)習(xí)下吧
    2020-11-11
  • C++索引越界的解決方法

    C++索引越界的解決方法

    本文主要介紹了C++索引越界的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C語(yǔ)言求解無(wú)向圖頂點(diǎn)之間的所有最短路徑

    C語(yǔ)言求解無(wú)向圖頂點(diǎn)之間的所有最短路徑

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言求解無(wú)向圖頂點(diǎn)之間的所有最短路徑,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++實(shí)現(xiàn)圖書信息管理系統(tǒng)

    C++實(shí)現(xiàn)圖書信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語(yǔ)言轉(zhuǎn)義字符詳解

    C語(yǔ)言轉(zhuǎn)義字符詳解

    這篇文章主要介紹了C語(yǔ)言轉(zhuǎn)義字符詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了C語(yǔ)言轉(zhuǎn)義字符該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++基于CMD命令行實(shí)現(xiàn)掃雷小游戲

    C++基于CMD命令行實(shí)現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了C++基于CMD命令行實(shí)現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語(yǔ)言中讀取時(shí)間日期的基本方法

    C語(yǔ)言中讀取時(shí)間日期的基本方法

    這篇文章主要介紹了C語(yǔ)言中讀取時(shí)間日期的基本方法,分別是time()函數(shù)和gmtime()函數(shù)的使用,注意返回值的區(qū)別,需要的朋友可以參考下
    2015-08-08
  • C語(yǔ)言中extern詳細(xì)用法解析

    C語(yǔ)言中extern詳細(xì)用法解析

    這篇文章主要介紹了C語(yǔ)言中extern詳細(xì)用法解析,本文講解的extern也是C語(yǔ)言中的關(guān)鍵詞,用來(lái)修飾函數(shù)聲明或變量等,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 使用VS Code的開(kāi)發(fā)環(huán)境配置教程圖文詳解

    使用VS Code的開(kāi)發(fā)環(huán)境配置教程圖文詳解

    這篇文章主要介紹了使用VS Code的開(kāi)發(fā)環(huán)境配置教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 淺析ORB、SURF、SIFT特征點(diǎn)提取方法以及ICP匹配方法

    淺析ORB、SURF、SIFT特征點(diǎn)提取方法以及ICP匹配方法

    這篇文章主要為大家介紹了常用的特征點(diǎn)提取方法(ORB、SURF、SIFT)和ICP匹配方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2021-12-12

最新評(píng)論

西吉县| 临清市| 贺州市| 平湖市| 山东| 西华县| 石屏县| 藁城市| 聂拉木县| 广南县| 山西省| 满洲里市| 岱山县| 澳门| 娱乐| 平潭县| 万盛区| 商丘市| 四子王旗| 江陵县| 长岭县| 高尔夫| 襄垣县| 滁州市| 高台县| 眉山市| 健康| 肃宁县| 辉南县| 昭苏县| 长阳| 临泉县| 望江县| 昌吉市| 青河县| 沅江市| 平武县| 乡宁县| 台江县| 桃园县| 老河口市|