QT筆記---JSON
- JSON
- 1、JSON基本概念
- 1.1、判斷.json文件工具
- 2、生成.json數據
- 3、解析.json數據
JSON
在現代軟件開發中,數據的交換和存儲格式至關重要。JSON(JavaScript Object Notation)作為一種輕量級的數據交換格式,以其簡潔易讀、易于解析和生成的特點,被廣泛應用于各種應用程序中。在 QT 框架下,處理 JSON 數據同樣便捷高效。
????本文參考鏈接:https://blog.csdn.net/qq_42432673/article/details/132115700
1、JSON基本概念
????????JSON 數據結構主要由兩種類型構成:對象(object)和數組(array)。對象是由鍵值對組成的無序集合,鍵必須是字符串,值可以是字符串、數字、布爾值、null、對象或數組。數組則是值的有序集合,這些值同樣可以是上述各種類型。例如:
{"address": {"city": "WuHan","street": "luck"},"age": "31","hobbies": ["reading","painting","playing guitar"],"isStudent": "true","name": "John Doe","phoneNumbers": [{"number": "888-1234","type": "home"},{"number": "888-5678","type": "work"}]
}
1.1、判斷.json文件工具
????JSON轉C#實體類網站,可判斷JSON文件是否正確:https://www.bejson.com/convert/json2csharp/
2、生成.json數據
????根據以上json內存,創建一個文件夾,將其寫入.json文件夾,保存在項目下,運行代碼如下所示:
//包含的頭文件
#include <QMainWindow>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QString>
#include <QFile>//創建一個json文件,寫入參數,并保存在對應的路徑下
void MainWindow::WriteToFile()
{QString m_path = QString::fromStdString(QCoreApplication::applicationDirPath().toStdString()+"//cfg.json");createJsonFile(m_path);
}
void MainWindow::createJsonFile(const QString &filePath)
{//創建一個JSON對象QJsonObject jsonObj;//插入name 鍵值對到 jsonObjjsonObj["name"]="John Doe";//jsonObj.insert("name","John Doe");//插入age 鍵值對到 jsonObjjsonObj["age"]="31";//jsonObj.insert("age","31");//創建地址JSON對象,里面包含兩個鍵值對QJsonObject addressObj;//插入city 鍵值到 “New York”addressObj.insert("city","WuHan");addressObj.insert("street","luck");jsonObj.insert("address",addressObj);//創建地址JSON對象,里面包含兩個鍵值對QJsonArray phoneArray;//創建兩個電話的JSON對象QJsonObject phoneHomeObj;phoneHomeObj.insert("type","home");phoneHomeObj.insert("number","888-1234");QJsonObject phoneWorkObj;phoneWorkObj.insert("type","work");phoneWorkObj.insert("number","888-5678");//將電話JSON數組中添加兩個電話JSON對象phoneArray.append(phoneHomeObj);phoneArray.append(phoneWorkObj);//將電話JSON數組中添加兩個電話JSON對象jsonObj.insert("phoneNumbers",phoneArray);//創建地址JSON對象,里面包含了三組數組QJsonArray hobbArray;hobbArray.append("reading");hobbArray.append("painting");hobbArray.append("playing guitar");jsonObj.insert("hobbies",hobbArray);jsonObj["isStudent"]="true";//創建一個JSON文檔QJsonDocument jsonDoc(jsonObj);//將JSON文檔內容寫入文件QFile file(filePath);if(!file.open(QIODevice::WriteOnly)){//處理錯誤,例如可以拋出異常或者返回錯誤的標志return;}file.write(jsonDoc.toJson());file.close();
}
3、解析.json數據
?????創建一個cfg.json文件,將其內容粘貼負責其內;
{"name": "小王","age": 30,"address": {"city": "北京","street": "人民路32號"},"phoneNumbers": [{"number": "999-123456","type": "家"},{"number": "999-654321","type": "公司"}]
}
使用QT解析以上json內容:
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <QDebug>
#include <QFile>QByteArray MainWindow::ReadJsonString(QString file_path)
{QFile file(file_path); //根據路徑打卡文件if (false == file.exists()) //判斷文件是否存在{return "none";}if (false == file.open(QIODevice::ReadOnly | QIODevice::Text)) //判斷文件是否可以正常以只讀模式打開{return "none";}QByteArray string_value = file.readAll(); //讀出.json所以內容file.close();return string_value;
}void MainWindow::AnalyJson()
{
//json文件所在路徑,可根據自己隨意定制QString path= QString::fromStdString(QCoreApplication::applicationDirPath().toStdString()+"//cfg.json");QByteArray reg_fpga = ReadJsonString(path);// 字符串格式化為JSON文檔QJsonParseError err_rpt;QJsonDocument reg_fpga_root = QJsonDocument::fromJson(reg_fpga, &err_rpt);if (err_rpt.error != QJsonParseError::NoError){// 不是 JSON 對象:JSON 字符串格式錯誤或無效std::cout << "json 格式錯誤" << std::endl;// return 0;}//將 QJsonDocument 對象中的 JSON 數據轉換為 JSON 對象QJsonObject reg_object = reg_fpga_root.object();// 獲取 JSON 數據中的所有鍵QStringList keys = reg_object.keys();// 遍歷鍵值對for (int i = 0;i<keys.size();++i) {// 獲取每一個 keyQString key = keys[i];// 通過 key 獲取對應的 valueQJsonValue value = obj.value(key);if(value.isBool()){// 值是一個 boolqDebug()<<key<<":"<<value.toBool();}else if(value.isString()){// 值是一個字符串qDebug()<<key<<":"<<value.toString();}else if(value.isDouble()){// 值是一個 double 或者 int(double 和 int 都用 isDouble)qDebug()<<key<<":"<<value.toInt();}else if(value.isObject()){// 值是一個 JSON 對象qDebug()<<key<<":";// 這里偷個懶,不再像上面那樣循環獲取值了,而是直接通過已知的鍵去獲取值QJsonObject addressObj = value.toObject();QString city = addressObj["city"].toString();QString street = addressObj["street"].toString();qDebug()<<" "<<"city:"<<city;qDebug()<<" "<<"street:"<<street;}else if (value.isArray()){// 值是一個 JSON 數組qDebug()<<key<<":";QJsonArray phoneArray = value.toArray();for (int i = 0;i<phoneArray.size();++i) {// 遍歷 JSON 數組中的每一個 JSON 對象QJsonObject phoneObj = phoneArray[i].toObject();QString number = phoneObj["number"].toString();QString type = phoneObj["type"].toString();qDebug()<<" "<<"number:"<<number;qDebug()<<" "<<"type:"<<type;}}}
}