JSON是一種簡單的輕量級資料交換格式,Qt庫為JSON的相關操作提供了完整的類支援,使用JSON解析檔案之前需要先通過TextStream
流將檔案讀入到字串變數內,然後再通過QJsonDocument
等庫對該JSON格式進行解析,以提取出我們所需欄位。
首先建立一個解析檔案,命名為config.json
我們將通過程式碼依次解析這個JSON檔案中的每一個引數,具體解析程式碼如下:
{
"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"}
]
}
首先實現讀寫文字檔案,通過QT中封裝的<QFile>
庫可實現對文字檔案的讀取操作,讀取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 << "讀入長度: " << 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();
}
}
// 傳入文字路徑與寫入內容,寫入到檔案
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;
}
//寫入內容,注意需要轉碼,否則會報錯
QByteArray write_string = string_value.toUtf8();
//寫入QByteArray格式字串
this_file_ptr.write(write_string);
this_file_ptr.close();
}
// 計算檔案或目錄大小
// 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");
// 計算檔案或目錄大小
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();
}
實現解析根物件
中的單一
的鍵值對
,例如解析配置檔案中的blog,enable,status
等這些獨立的欄位值.
// 讀取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格式錯誤" << std::endl;
return 0;
}
// 獲取到Json字串的根節點
QJsonObject root_object = root_document.object();
// 解析blog欄位
QString blog = root_object.find("blog").value().toString();
std::cout << "欄位對應的值 = > "<< blog.toStdString() << std::endl;
// 解析enable欄位
bool enable = root_object.find("enable").value().toBool();
std::cout << "是否開啟狀態: " << enable << std::endl;
// 解析status欄位
int status = root_object.find("status").value().toInt();
std::cout << "狀態數值: " << status << std::endl;
return a.exec();
}
實現解析簡單的單物件
與單陣列
結構,如上配置檔案中的GetDict
與GetList
既是我們需要解析的內容.
// 讀取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格式錯誤" << std::endl;
return 0;
}
// 獲取到Json字串的根節點
QJsonObject root_object = root_document.object();
// 解析單一物件
// 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;
}
// 解析單一陣列
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 << "輸出陣列元素: " << ref_value << std::endl;
}
return a.exec();
}
實現解析物件巢狀物件
且物件中巢狀陣列
結構,如上配置檔案中的ObjectInArrayJson
既是我們需要解析的內容.
// 讀取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格式錯誤" << std::endl;
return 0;
}
// 獲取到Json字串的根節點
QJsonObject root_object = root_document.object();
// 找到Object物件
QJsonObject one_object_json = root_object.find("ObjectInArrayJson").value().toObject();
// 轉為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();
}
實現解析陣列中的陣列
結構,如上配置檔案中的ArrayJson
既是我們需要解析的內容.
// 讀取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 格式錯誤" << std::endl;
return 0;
}
// 獲取到Json字串的根節點
QJsonObject root_object = root_document.object();
// 獲取MyJson陣列
QJsonValue array_value = root_object.value("ArrayJson");
// 驗證節點是否為陣列
if(array_value.isArray())
{
// 得到陣列個數
int array_count = array_value.toArray().count();
// 迴圈陣列個數
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()
<< " 埠號: " << userport.toStdString()
<< std::endl;
}
}
}
return a.exec();
}
實現解析陣列中的多物件
結構,如上配置檔案中的ObjectJson
既是我們需要解析的內容.
// 讀取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 格式錯誤" << std::endl;
return 0;
}
// 獲取到Json字串的根節點
QJsonObject root_object = root_document.object();
// 獲取MyJson陣列
QJsonValue object_value = root_object.value("ObjectJson");
// 驗證是否為陣列
// PowerBy: www.cnblogs.com/lyshark
if(object_value.isArray())
{
// 獲取物件個數
int object_count = object_value.toArray().count();
// 迴圈個數
for(int index=0;index <= object_count;index++)
{
QJsonObject obj = object_value.toArray().at(index).toObject();
// 驗證陣列不為空
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();
}