Qt的QJsonObject存儲(chǔ)QByteArray的方法實(shí)現(xiàn)
在 Qt 中,QJsonObject 本身不直接支持存儲(chǔ) QByteArray 類(lèi)型(因?yàn)?JSON 標(biāo)準(zhǔn)僅支持字符串、數(shù)字、布爾、數(shù)組、對(duì)象、null 六種類(lèi)型),但可以通過(guò) Base64 編碼 將 QByteArray 轉(zhuǎn)換為 JSON 支持的字符串類(lèi)型存儲(chǔ),讀取時(shí)再解碼回 QByteArray。
核心思路
JSON 僅支持字符串類(lèi)型,因此:
- 存儲(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é)說(shuō)明
Base64 編碼的兼容性:
- Base64 編碼后的字符串是純 ASCII 字符,完全符合 JSON 字符串規(guī)范,可跨平臺(tái)、跨語(yǔ)言解析(如 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ì)解碼為空,無(wú)需額外判斷,兼容性良好。
擴(kuò)展:使用自定義序列化(Qt 5.15+)
若使用 Qt 5.15 及以上版本,可通過(guò) QJsonValue::fromVariant() 間接支持 QByteArray(本質(zhì)還是 Base64 編碼),但不推薦直接依賴(lài)(可讀性差,跨語(yǔ)言不兼容):
// 不推薦(僅 Qt 內(nèi)部兼容,跨語(yǔ)言解析困難) 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)/跨語(yǔ)言兼容;
- 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++的基本算法實(shí)現(xiàn)十個(gè)數(shù)排序
以下是對(duì)利用C++的基本算法實(shí)現(xiàn)十個(gè)數(shù)排序的代碼進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10
C++?AnimeGAN實(shí)現(xiàn)照片一鍵動(dòng)漫化
AnimeGAN是是由神經(jīng)網(wǎng)絡(luò)風(fēng)格遷移加生成對(duì)抗網(wǎng)絡(luò)(GAN)而成,它是基于CartoonGAN的改進(jìn),并提出了一個(gè)更加輕量級(jí)的生成器架構(gòu)。本文將介紹如何運(yùn)用AnimeGAN實(shí)現(xiàn)照片一鍵動(dòng)漫化,需要的可以參考一下2021-11-11

