在 qt 中,qjsonobject 本身不直接支持存储 qbytearray 类型(因为 json 标准仅支持字符串、数字、布尔、数组、对象、null 六种类型),但可以通过 base64 编码 将 qbytearray 转换为 json 支持的字符串类型存储,读取时再解码回 qbytearray。
核心思路
json 仅支持字符串类型,因此:
- 存储:将 qbytearray 用 base64 编码为 qstring,再存入 qjsonobject;
- 读取:从 qjsonobject 中取出 qstring,用 base64 解码回 qbytearray。
qt 提供了 qbytearray::tobase64() 和 qbytearray::frombase64() 方法,直接支持该转换。
完整示例代码
#include <qcoreapplication>
#include <qjsonobject>
#include <qbytearray>
#include <qdebug>
int main(int argc, char *argv[])
{
qcoreapplication a(argc, argv);
// 1. 准备原始 qbytearray 数据(示例:二进制数据或文件内容)
qbytearray originaldata = "hello qbytearray + qjsonobject!"; // 也可以是二进制数据(如图片、文件)
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()); // 解码
// 验证结果
qdebug() << "解码后的 qbytearray:" << decodeddata;
qdebug() << "是否一致:" << (originaldata == decodeddata);
return a.exec();
}
关键细节说明
base64 编码的兼容性:
- base64 编码后的字符串是纯 ascii 字符,完全符合 json 字符串规范,可跨平台、跨语言解析(如 java、python 等也支持 base64 解码)。
- 若需要 url 安全的 base64 编码(避免 +、/ 等特殊字符),可使用 qbytearray::tobase64(qbytearray::base64urlencoding),解码时对应 qbytearray::frombase64(..., qbytearray::base64urlencoding)。
二进制数据的处理:
示例中用了字符串作为 qbytearray 内容,实际使用时,originaldata 可以是任意二进制数据(如读取文件、网络传输的二进制流):// 示例:读取图片文件为 qbytearray qfile file("test.png"); if (file.open(qiodevice::readonly)) { qbytearray imagedata = file.readall(); jsonobj["image"] = imagedata.tobase64(); // 存入 json file.close(); }空数据处理:
若 qbytearray 为空,tobase64() 会返回空字符串,frombase64() 也会解码为空,无需额外判断,兼容性良好。
扩展:使用自定义序列化(qt 5.15+)
若使用 qt 5.15 及以上版本,可通过 qjsonvalue::fromvariant() 间接支持 qbytearray(本质还是 base64 编码),但不推荐直接依赖(可读性差,跨语言不兼容):
// 不推荐(仅 qt 内部兼容,跨语言解析困难) jsonobj["binarydata"] = qjsonvalue::fromvariant(originaldata); qbytearray decodeddata = jsonobj["binarydata"].tovariant().tobytearray();
总结
推荐使用 base64 编码 方式存储 qbytearray 到 qjsonobject,优点是:
- 完全符合 json 标准,跨平台/跨语言兼容;
- qt 原生支持,代码简洁;
- 支持任意二进制数据(包括空数据)。
到此这篇关于qt的qjsonobject存储qbytearray的方法实现的文章就介绍到这了,更多相关qt 存储qbytearray内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论