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++11中的几种锁

    浅谈C++11中的几种锁

    本文主要介绍了C++11中的几种锁,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C++结合OpenCV实现RRT算法(路径规划算法)

    C++结合OpenCV实现RRT算法(路径规划算法)

    这篇文章主要介绍了C++结合OpenCV实现RRT算法,RRT算法整体框架主要分为rand、near、new三点的建立和near与new之间的安全性检查,需要的朋友可以参考下
    2022-05-05
  • C语言实现访问及查询MySQL数据库的方法

    C语言实现访问及查询MySQL数据库的方法

    这篇文章主要介绍了C语言实现访问及查询MySQL数据库的方法,涉及C语言基于libmysql.lib实现访问MySQL数据库的相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • C语言实现绘制余弦曲线

    C语言实现绘制余弦曲线

    这篇文章主要为大家详细介绍了C语言实现绘制余弦曲线的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • C++实现LeetCode(198.打家劫舍)

    C++实现LeetCode(198.打家劫舍)

    这篇文章主要介绍了C++实现LeetCode(198.打家劫舍),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Windows系统下使用C语言编写单线程的文件备份程序

    Windows系统下使用C语言编写单线程的文件备份程序

    这篇文章主要介绍了Windows系统下使用C语言编写单线程的文件备份程序,文中给出了实现的几个关键代码片段,剩下的只要套上main和线程调用的相关函数即可,非常详细,需要的朋友可以参考下
    2016-02-02
  • C++中map和set的使用示例详解

    C++中map和set的使用示例详解

    set的底层是用红黑树实现的,增删查的效率是O(logn),迭代器遍历走的是搜索树的中序遍历,所以遍历后的元素是有序的,本文给大家介绍了C++中map和set的使用示例,感兴趣的朋友一起看看吧
    2025-05-05
  • 浅析bilateral filter双边滤波器的理解

    浅析bilateral filter双边滤波器的理解

    这篇文章主要介绍了bilateral filter双边滤波器的通俗理解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • C++ HTTP框架推荐(特点及优势)

    C++ HTTP框架推荐(特点及优势)

    这篇文章主要介绍了C++ HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-05-05
  • C语言实现的循环单链表功能示例

    C语言实现的循环单链表功能示例

    这篇文章主要介绍了C语言实现的循环单链表功能,结合实例形式分析了基于C语言实现的循环单链表定义、创建、添加、删除、打印、排序等相关操作技巧,需要的朋友可以参考下
    2018-04-04

最新评论