一.概念介紹
JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,常用于前后端數據傳輸和存儲。它具有以下特點:
-
易讀性:JSON 使用人類可讀的文本格式表示數據,采用鍵值對的方式組織數據,易于閱讀和編輯。
-
輕量級:JSON 數據格式較為簡潔,不包含冗余信息,適合網絡傳輸和存儲。
-
自描述性:JSON 數據的結構清晰明了,鍵值對以及數組的嵌套結構能夠清晰地表示復雜數據。
-
易于解析:JSON 數據可以方便地被解析成多種編程語言中的數據結構,如對象、數組等。
-
跨平臺兼容:由于 JSON 是一種文本格式,不依賴特定的編程語言,能夠被多種編程語言解析和生成。
JSON 數據通常由對象(Object)和數組(Array)組成:
- 對象(Object):由一組鍵值對構成,使用大括號 {} 表示。示例:{“name”: “Alice”, “age”: 30}
- 數組(Array):由一組值構成,使用中括號 [] 表示。數組中的元素可以是對象、數組或基本數據類型。示例:[“apple”, “banana”, “cherry”]
總之,JSON 是一種簡單、輕量級、易讀的數據交換格式,被廣泛應用于 Web 開發、API 設計和數據交換等領域。通過了解 JSON 的基本概念和語法規則,可以更好地進行數據交互與處理。
二.重要的部分介紹
1. QJsonDocument:
- QJsonDocument 類用于表示整個 JSON 文檔,可以包含一個 JSON 對象或一個 JSON 數組。
- 可以使用該類來創建、讀取、寫入和操作 JSON 數據。
- 成員函數:toJson() 將 JSON 文檔轉換為字符串,fromJson() 從字符串中解析 JSON 數據。
示例代碼如下:
#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 創建 JSON 對象QJsonObject personObject;personObject["name"] = "Alice";personObject["age"] = 30;personObject["isStudent"] = true;QJsonArray fruitsArray = {"apple", "banana", "cherry"};personObject["favoriteFruits"] = fruitsArray;QJsonObject addressObject;addressObject["city"] = "New York";addressObject["zipcode"] = "10001";personObject["address"] = addressObject;// 將 JSON 對象轉換為 JSON 文檔QJsonDocument jsonDocument(personObject);// 將 JSON 文檔轉換為 JSON 字符串QString jsonString = jsonDocument.toJson();qDebug() << "Generated JSON string:" << jsonString;// 解析 JSON 字符串為 JSON 文檔QJsonDocument parsedDocument = QJsonDocument::fromJson(jsonString.toUtf8());if (!parsedDocument.isNull() && parsedDocument.isObject()) {QJsonObject parsedObject = parsedDocument.object();QString name = parsedObject["name"].toString();int age = parsedObject["age"].toInt();bool isStudent = parsedObject["isStudent"].toBool();qDebug() << "Parsed name:" << name;qDebug() << "Parsed age:" << age;qDebug() << "Parsed isStudent:" << isStudent;} else {qDebug() << "Failed to parse JSON";}return a.exec();
}
2.QJsonObject(這和map很相似)
- QJsonObject 類用于表示 JSON 對象,它是鍵值對的集合,其中鍵為字符串,值可以是字符串、整數、布爾值、對象或數組。
- 可以通過下標操作符 [] 或 insert() 方法來添加鍵值對。
- 成員函數:value() 可以獲取指定鍵對應的值,contains() 用于檢查是否包含指定鍵。
示例代碼如下:
#include <QCoreApplication>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 創建一個空的 JSON 對象QJsonObject personObject;// 添加鍵值對到 JSON 對象personObject["name"] = "Alice";personObject["age"] = 30;personObject["isStudent"] = true;// 創建包含一組值的 JSON 數組QJsonArray fruitsArray = {"apple", "banana", "cherry"};personObject["favoriteFruits"] = fruitsArray;// 創建一個嵌套的 JSON 對象QJsonObject addressObject;addressObject["city"] = "New York";addressObject["zipcode"] = "10001";personObject["address"] = addressObject;// 訪問和輸出 JSON 對象中的值qDebug() << "Name:" << personObject["name"].toString();qDebug() << "Age:" << personObject["age"].toInt();qDebug() << "Is Student:" << personObject["isStudent"].toBool();// 訪問嵌套的 JSON 對象中的值QJsonObject nestedAddress = personObject["address"].toObject();qDebug() << "City:" << nestedAddress["city"].toString();qDebug() << "Zipcode:" << nestedAddress["zipcode"].toString();// 修改 JSON 對象中的值personObject["age"] = 35;// 移除 JSON 對象中的某個鍵值對personObject.remove("isStudent");// 轉換 JSON 對象為字符串QJsonDocument jsonDocument(personObject);QString jsonString = jsonDocument.toJson();qDebug() << "Updated JSON object:" << jsonString;return a.exec();
}
3. QJsonArray
- QJsonArray 類用于表示 JSON 數組,它是值的有序集合,值可以是字符串、整數、布爾值、對象或數組。
- 可以使用 append()、insert()、at() 等方法操作數組元素。
- 成員函數:size() 返回數組中元素的數量,at() 根據索引獲取指定位置的元素。
#include <QCoreApplication>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 創建一個空的 JSON 數組QJsonArray fruitsArray;// 向 JSON 數組添加元素fruitsArray.append("apple");fruitsArray.append("banana");fruitsArray.append("cherry");// 創建一個包含多個不同類型元素的 JSON 數組QJsonArray mixedArray;mixedArray.append(10);mixedArray.append(true);mixedArray.append("hello");// 輸出數組元素qDebug() << "Fruits in the array:";for(const QJsonValue &value : fruitsArray) {qDebug() << value.toString();}qDebug() << "Elements in mixed array:";for(const QJsonValue &value : mixedArray) {if(value.isBool()) {qDebug() << value.toBool();} else if(value.isDouble()) {qDebug() << value.toDouble();} else if(value.isString()) {qDebug() << value.toString();}}// 訪問數組元素qDebug() << "First fruit:" << fruitsArray.at(0).toString();qDebug() << "Last fruit:" << fruitsArray.last().toString();// 修改數組元素fruitsArray.replace(1, "pear");// 移除數組元素fruitsArray.removeAt(2);// 轉換 JSON 數組為字符串QJsonDocument jsonDocument(fruitsArray);QString jsonString = jsonDocument.toJson();qDebug() << "Updated JSON array:" << jsonString;return a.exec();
}
4.JSON 數據的解析
- 使用 QJsonDocument::fromJson() 將 JSON 字符串解析為 QJsonDocument 對象。
- 判斷解析后的對象類型(是對象還是數組),然后獲取各個屬性的值。
5. QString與QByteArray
在 Qt 中,QString 和 QByteArray 是兩種用于處理字符串數據的類,它們在存儲和操作字符串上有一些不同之處。下面是關于 QString 和 QByteArray 的詳細介紹:
QString
-
QString 是 Qt 中用于表示 Unicode 字符串的類,它支持多種字符編碼,包括 UTF-8、UTF-16 等。
-
特點:
- 支持 Unicode 字符,可以表示任意國家地區的字符。
- 自動轉碼:QString 會自動處理不同字符編碼之間的轉換。例如,可以使用 toUtf8() 方法將 QString 轉換為 QByteArray。
- 提供了豐富的字符串操作方法,如拼接、查找、替換、大小寫轉換等。
使用場景:
- 存儲用戶界面文本、表示用戶輸入。
- 作為跨平臺的字符串處理工具,便于處理各種字符編碼和國際化需求。
QByteArray
- QByteArray 是 Qt 中用于表示字節數據的類,通常用于存儲二進制數據或者不包含特定字符編碼的文本數據。
特點:
- 與 QString 不同,QByteArray 主要是字節級別的操作,適用于處理二進制數據。
- 通常用于讀寫文件、網絡數據、加密解密等場景。
- 字節數據一般不涉及字符編碼的轉換,更適合存儲不特定編碼的數據。
使用場景:
- 存儲二進制數據,如圖片、音頻、視頻等。
- 讀寫文件內容,處理網絡數據傳輸。
- 加密解密操作等需要處理字節數據的場景。
總結
-
如果需要處理文本數據,并且涉及到字符串操作、多語言支持或者用戶界面相關的文本處理,通常使用 QString。
-
如果處理的數據為字節數據、二進制數據或者不需要特定字符編碼的數據,可以使用 QByteArray。
三.JSON讀寫文件實戰
- Json格式如下:
{"Name":"Ace","Sex":"man","Age":20,"Family":{"Father":"Gol·D·Roger","Mother":"Portgas·D·Rouge","Brother":["Sabo", "Monkey D. Luffy"]},"IsAlive":false,"Comment":"yyds"
}
- 寫文件
void MainWindow::writeJson()
{//創建一個Json對象QJsonObject obj;//對象可以說是和map一模一樣//"Ace"發生了隱式類型轉換obj.insert("name","Ace");obj.insert("sex","man");obj.insert("age",20);//創建子對象QJsonObject subObj;subObj.insert("father","Gol·D·Roger");subObj.insert("Mother","Portgas·D·Rouge");//構建一個Json數組的對象QJsonArray array;array.append("Sabo");array.append("Monkey D. Luffy");subObj.insert("Brother",array);obj.insert("Family",subObj);obj.insert("IsAlive",false);obj.insert("Comment","yyds");//將json的對象轉換成文檔類型QJsonDocument doc(obj);//將其轉換成字符串類型,QByteArray在qt中就是表示字符串QByteArray json = doc.toJson();//寫入磁盤文件中QFile file("G:\\qtcodetest\\QJsonTest\\mytest.json");file.open(QFile::WriteOnly);file.write(json);file.close();}
- 讀文件
void MainWindow::readJson()
{//讀文件QFile file("G:\\qtcodetest\\QJsonTest\\mytest.json");file.open(QFile::ReadOnly);QByteArray all = file.readAll();file.close();//讀出的文件進行轉換QJsonDocument doc = QJsonDocument::fromJson(all);if(doc.isObject()){QJsonObject obj = doc.object();QStringList keys = obj.keys();for(int i=0; i<keys.size(); ++i){QString key = keys.at(i);QJsonValue value = obj.value(key);if(value.isBool()){qDebug() << key << ":" << value.toBool();}if(value.isString()){qDebug() << key << ":" << value.toString();}if(value.isDouble()){qDebug() << key << ":" << value.toInt();}if(value.isObject()){qDebug()<< key << ":";// 直接處理內部鍵值對, 不再進行類型判斷的演示QJsonObject subObj = value.toObject();QStringList ls = subObj.keys();for(int i=0; i<ls.size(); ++i){QJsonValue subVal = subObj.value(ls.at(i));if(subVal.isString()){qDebug() << " " << ls.at(i) << ":" << subVal.toString();}if(subVal.isArray()){QJsonArray array = subVal.toArray();qDebug() << " " << ls.at(i) << ":";for(int j=0; j<array.size(); ++j){// 因為知道數組內部全部為字符串, 不再對元素類型進行判斷qDebug() << " " << array[j].toString();}}}}}}
}