Qt的QJsonObject存儲QByteArray的方法實現(xiàn)
在 Qt 中,QJsonObject 本身不直接支持存儲 QByteArray 類型(因為 JSON 標準僅支持字符串、數(shù)字、布爾、數(shù)組、對象、null 六種類型),但可以通過 Base64 編碼 將 QByteArray 轉(zhuǎn)換為 JSON 支持的字符串類型存儲,讀取時再解碼回 QByteArray。
核心思路
JSON 僅支持字符串類型,因此:
- 存儲:將 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. 準備原始 QByteArray 數(shù)據(jù)(示例:二進制數(shù)據(jù)或文件內(nèi)容)
QByteArray originalData = "Hello QByteArray + QJsonObject!"; // 也可以是二進制數(shù)據(jù)(如圖片、文件)
qDebug() << "原始 QByteArray:" << originalData;
// 2. 將 QByteArray 編碼為 Base64 字符串(存入 QJsonObject)
QJsonObject jsonObj;
QString base64Str = originalData.toBase64(); // 編碼為 Base64 字符串
jsonObj["binaryData"] = base64Str; // 存入 JSON 對象
// 3. 從 QJsonObject 讀取并解碼回 QByteArray
QString retrievedBase64 = jsonObj["binaryData"].toString(); // 取出 Base64 字符串
QByteArray decodedData = QByteArray::fromBase64(retrievedBase64.toUtf8()); // 解碼
// 驗證結(jié)果
qDebug() << "解碼后的 QByteArray:" << decodedData;
qDebug() << "是否一致:" << (originalData == decodedData);
return a.exec();
}
關(guān)鍵細節(jié)說明
Base64 編碼的兼容性:
- Base64 編碼后的字符串是純 ASCII 字符,完全符合 JSON 字符串規(guī)范,可跨平臺、跨語言解析(如 Java、Python 等也支持 Base64 解碼)。
- 若需要 URL 安全的 Base64 編碼(避免 +、/ 等特殊字符),可使用 QByteArray::toBase64(QByteArray::Base64UrlEncoding),解碼時對應(yīng) QByteArray::fromBase64(..., QByteArray::Base64UrlEncoding)。
二進制數(shù)據(jù)的處理:
示例中用了字符串作為 QByteArray 內(nèi)容,實際使用時,originalData 可以是任意二進制數(shù)據(jù)(如讀取文件、網(wǎng)絡(luò)傳輸?shù)亩M制流):// 示例:讀取圖片文件為 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() 會返回空字符串,fromBase64() 也會解碼為空,無需額外判斷,兼容性良好。
擴展:使用自定義序列化(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 編碼 方式存儲 QByteArray 到 QJsonObject,優(yōu)點是:
- 完全符合 JSON 標準,跨平臺/跨語言兼容;
- Qt 原生支持,代碼簡潔;
- 支持任意二進制數(shù)據(jù)(包括空數(shù)據(jù))。
到此這篇關(guān)于Qt的QJsonObject存儲QByteArray的方法實現(xiàn)的文章就介紹到這了,更多相關(guān)Qt 存儲QByteArray內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

