C/C++?Qt?運(yùn)用JSON解析庫的實(shí)例代碼
JSON是一種簡(jiǎn)單的輕量級(jí)數(shù)據(jù)交換格式,Qt庫為JSON的相關(guān)操作提供了完整的類支持,使用JSON解析文件之前需要先通過TextStream
流將文件讀入到字符串變量?jī)?nèi),然后再通過QJsonDocument
等庫對(duì)該JSON格式進(jìn)行解析,以提取出我們所需字段。
首先創(chuàng)建一個(gè)解析文件,命名為config.json
我們將通過代碼依次解析這個(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)讀寫文本文件,通過QT中封裝的<QFile>
庫可實(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; } /* * 文件打開屬性包括如下 * QIODevice::ReadOnly 只讀方式打開 * QIODevice::WriteOnly 寫入方式打開 * QIODevice::ReadWrite 讀寫方式打開 * QIODevice::Append 追加方式打開 * QIODevice::Truncate 截取方式打開 * QIODevice::Text 文本方式打開 */ if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text)) { std::cout << "打開失敗" << 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; } // 打開失敗 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 << "是否開啟狀態(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),如上配置文件中的GetDict
與GetList
既是我們需要解析的內(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解析庫的實(shí)例代碼的文章就介紹到這了,更多相關(guān)C++ Qt JSON解析庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言?動(dòng)態(tài)內(nèi)存管理全面解析
動(dòng)態(tài)內(nèi)存是相對(duì)靜態(tài)內(nèi)存而言的。所謂動(dòng)態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存,本文帶你深入探究C語言中動(dòng)態(tài)內(nèi)存的管理2022-02-02C++設(shè)計(jì)模式編程中的迭代器模式應(yīng)用解析
這篇文章主要介紹了C++設(shè)計(jì)模式編程中的迭代器模式應(yīng)用解析,迭代器模式注重對(duì)集合中元素的遍歷而不使其暴露,需要的朋友可以參考下2016-03-03C++如何調(diào)用opencv完成運(yùn)動(dòng)目標(biāo)捕捉詳解
OpenCV作為機(jī)器視覺開源庫,使用起來非常不錯(cuò),這篇文章主要給大家介紹了關(guān)于C++如何調(diào)用opencv完成運(yùn)動(dòng)目標(biāo)捕捉的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05詳細(xì)分析c++ const 指針與指向const的指針
這篇文章主要介紹了c++ const 指針與指向const的指針的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07C++編程中的const關(guān)鍵字常見用法總結(jié)
這篇文章主要介紹了C++編程中的const關(guān)鍵字常見用法總結(jié),const關(guān)鍵字的使用是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-11-11