Qt的QJsonObject存儲(chǔ)QByteArray的方法實(shí)現(xiàn)
在 Qt 中,QJsonObject 本身不直接支持存儲(chǔ) QByteArray 類型(因?yàn)?JSON 標(biāo)準(zhǔn)僅支持字符串、數(shù)字、布爾、數(shù)組、對(duì)象、null 六種類型),但可以通過 Base64 編碼 將 QByteArray 轉(zhuǎn)換為 JSON 支持的字符串類型存儲(chǔ),讀取時(shí)再解碼回 QByteArray。
核心思路
JSON 僅支持字符串類型,因此:
- 存儲(chǔ):將 QByteArray 用 Base64 編碼為 QString,再存入 QJsonObject;
- 讀取:從 QJsonObject 中取出 QString,用 Base64 解碼回 QByteArray。
Qt 提供了 QByteArray::toBase64() 和 QByteArray::fromBase64() 方法,直接支持該轉(zhuǎn)換。
完整示例代碼
#include <QCoreApplication>
#include <QJsonObject>
#include <QByteArray>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 1. 準(zhǔn)備原始 QByteArray 數(shù)據(jù)(示例:二進(jìn)制數(shù)據(jù)或文件內(nèi)容)
QByteArray originalData = "Hello QByteArray + QJsonObject!"; // 也可以是二進(jìn)制數(shù)據(jù)(如圖片、文件)
qDebug() << "原始 QByteArray:" << originalData;
// 2. 將 QByteArray 編碼為 Base64 字符串(存入 QJsonObject)
QJsonObject jsonObj;
QString base64Str = originalData.toBase64(); // 編碼為 Base64 字符串
jsonObj["binaryData"] = base64Str; // 存入 JSON 對(duì)象
// 3. 從 QJsonObject 讀取并解碼回 QByteArray
QString retrievedBase64 = jsonObj["binaryData"].toString(); // 取出 Base64 字符串
QByteArray decodedData = QByteArray::fromBase64(retrievedBase64.toUtf8()); // 解碼
// 驗(yàn)證結(jié)果
qDebug() << "解碼后的 QByteArray:" << decodedData;
qDebug() << "是否一致:" << (originalData == decodedData);
return a.exec();
}
關(guān)鍵細(xì)節(jié)說明
Base64 編碼的兼容性:
- Base64 編碼后的字符串是純 ASCII 字符,完全符合 JSON 字符串規(guī)范,可跨平臺(tái)、跨語言解析(如 Java、Python 等也支持 Base64 解碼)。
- 若需要 URL 安全的 Base64 編碼(避免 +、/ 等特殊字符),可使用 QByteArray::toBase64(QByteArray::Base64UrlEncoding),解碼時(shí)對(duì)應(yīng) QByteArray::fromBase64(..., QByteArray::Base64UrlEncoding)。
二進(jìn)制數(shù)據(jù)的處理:
示例中用了字符串作為 QByteArray 內(nèi)容,實(shí)際使用時(shí),originalData 可以是任意二進(jìn)制數(shù)據(jù)(如讀取文件、網(wǎng)絡(luò)傳輸?shù)亩M(jìn)制流):// 示例:讀取圖片文件為 QByteArray QFile file("test.png"); if (file.open(QIODevice::ReadOnly)) { QByteArray imageData = file.readAll(); jsonObj["image"] = imageData.toBase64(); // 存入 JSON file.close(); }空數(shù)據(jù)處理:
若 QByteArray 為空,toBase64() 會(huì)返回空字符串,fromBase64() 也會(huì)解碼為空,無需額外判斷,兼容性良好。
擴(kuò)展:使用自定義序列化(Qt 5.15+)
若使用 Qt 5.15 及以上版本,可通過 QJsonValue::fromVariant() 間接支持 QByteArray(本質(zhì)還是 Base64 編碼),但不推薦直接依賴(可讀性差,跨語言不兼容):
// 不推薦(僅 Qt 內(nèi)部兼容,跨語言解析困難) jsonObj["binaryData"] = QJsonValue::fromVariant(originalData); QByteArray decodedData = jsonObj["binaryData"].toVariant().toByteArray();
總結(jié)
推薦使用 Base64 編碼 方式存儲(chǔ) QByteArray 到 QJsonObject,優(yōu)點(diǎn)是:
- 完全符合 JSON 標(biāo)準(zhǔn),跨平臺(tái)/跨語言兼容;
- Qt 原生支持,代碼簡(jiǎn)潔;
- 支持任意二進(jìn)制數(shù)據(jù)(包括空數(shù)據(jù))。
到此這篇關(guān)于Qt的QJsonObject存儲(chǔ)QByteArray的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Qt 存儲(chǔ)QByteArray內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ 組合 (Composition)的介紹與實(shí)例
這篇文章主要給大家介紹了關(guān)于C++ 組合(Composition)的相關(guān)資料,組合就是將對(duì)象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。需要的朋友可以參考下2021-05-05

