Qt的QJsonObject存储QByteArray的方法实现

 更新时间:2026年02月02日 09:23:34   作者:上去我就QWER  
本文主要介绍了Qt的QJsonObject存储QByteArray的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在 Qt 中,QJsonObject 本身不直接支持存储 QByteArray 类型(因为 JSON 标准仅支持字符串、数字、布尔、数组、对象、null 六种类型),但可以通过 Base64 编码 将 QByteArray 转换为 JSON 支持的字符串类型存储,读取时再解码回 QByteArray。

核心思路

JSON 仅支持字符串类型,因此:

  1. 存储:将 QByteArray 用 Base64 编码为 QString,再存入 QJsonObject;
  2. 读取:从 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();
}

关键细节说明

  1. Base64 编码的兼容性

    • Base64 编码后的字符串是纯 ASCII 字符,完全符合 JSON 字符串规范,可跨平台、跨语言解析(如 Java、Python 等也支持 Base64 解码)。
    • 若需要 URL 安全的 Base64 编码(避免 +、/ 等特殊字符),可使用 QByteArray::toBase64(QByteArray::Base64UrlEncoding),解码时对应 QByteArray::fromBase64(..., QByteArray::Base64UrlEncoding)。
  2. 二进制数据的处理:
    示例中用了字符串作为 QByteArray 内容,实际使用时,originalData 可以是任意二进制数据(如读取文件、网络传输的二进制流):

    // 示例:读取图片文件为 QByteArray
    QFile file("test.png");
    if (file.open(QIODevice::ReadOnly)) {
        QByteArray imageData = file.readAll();
        jsonObj["image"] = imageData.toBase64(); // 存入 JSON
        file.close();
    }
    
  3. 空数据处理
    若 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 编码 方式存储 QByteArrayQJsonObject,优点是:

  • 完全符合 JSON 标准,跨平台/跨语言兼容;
  • Qt 原生支持,代码简洁;
  • 支持任意二进制数据(包括空数据)。

到此这篇关于Qt的QJsonObject存储QByteArray的方法实现的文章就介绍到这了,更多相关Qt 存储QByteArray内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++中形参和实参的区别及说明

    C++中形参和实参的区别及说明

    这篇文章主要介绍了C++中形参和实参的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 用C++实现推箱子

    用C++实现推箱子

    这篇文章主要为大家详细介绍了用C++实现推箱子,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • C语言指针之必须要掌握的指针基础知识

    C语言指针之必须要掌握的指针基础知识

    这篇文章主要介绍了C语言指针必须要掌握的基础知识,文中实例讲解的很清晰,有不太懂的同学可以研究下,希望能够给你带来帮助
    2021-09-09
  • 基于C++自动化编译工具的使用详解

    基于C++自动化编译工具的使用详解

    本篇文章是对C++中自动化编译工具的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • ReSharper 的安装使用详细教程

    ReSharper 的安装使用详细教程

    resharper安装教程是关于vs2012一个非常好用的插件的安装教程,建议大家尝试安装,今天通过本教程帮助大家学习ReSharper 的安装使用详细教程,感兴趣的朋友一起看看吧
    2021-06-06
  • C++初级线程管理

    C++初级线程管理

    这篇文章主要介绍了C++初级线程管理,C++11中提供了std::thread库,本文将从线程的启动、线程等待、线程分离、线程传参、线程识别等几个方面介绍初级线程管理的知识,需要的朋友可以参考一下
    2021-12-12
  • C++函数模板与重载解析超详细讲解

    C++函数模板与重载解析超详细讲解

    模板是C++最重要的设计。这篇文章讲的是函数模板,只是简单介绍模板的一些功能,关于模板的更多的内容会在类模板中详细介绍。文章还着重介绍了重载解析过程
    2022-08-08
  • VC下实现fopen支持中文的方法

    VC下实现fopen支持中文的方法

    这篇文章主要介绍了VC下实现fopen支持中文的方法,需要的朋友可以参考下
    2014-07-07
  • C++ 组合 (Composition)的介绍与实例

    C++ 组合 (Composition)的介绍与实例

    这篇文章主要给大家介绍了关于C++ 组合(Composition)的相关资料,组合就是将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。需要的朋友可以参考下
    2021-05-05
  • C++实现乒乓球比分判定

    C++实现乒乓球比分判定

    这篇文章主要为大家详细介绍了C++实现乒乓球比分判定,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05

最新评论