- 📢博客主页:https://loewen.blog.csdn.net
- 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
- 📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉
- 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨
文章预览:
- 一. JSON数据之间的转换
- 二. JSON数据的压缩
一. JSON数据之间的转换
在Qt框架中,QJsonObject
、QJsonDocument
、QJsonArray
和 QByteArray
是处理JSON数据的核心类。它们之间的转换通常涉及序列化和反序列化过程。以下是如何在这些类之间进行转换的详细指导:
1、QJsonObject
与 QJsonDocument
的转换
QJsonObject
转QJsonDocument
:
QJsonDocument
可以用来包装一个QJsonObject
或QJsonArray
,以便将其序列化为JSON
格式的字符串或字节数组。
QJsonObject jsonObj;
// 填充 jsonObj ...
QJsonDocument jsonDoc(jsonObj);
QJsonDocument
转QJsonObject
QJsonDocument jsonDoc = QJsonDocument::fromJson(someByteArray);
if (!jsonDoc.isNull() && jsonDoc.isObject()) {
QJsonObject jsonObj = jsonDoc.object();
2、QJsonArray
与 QJsonDocument
的转换
QJsonArray
转QJsonDocument
:
与QJsonObject
类似,QJsonDocument
也可以用来包装一个QJsonArray
。
QJsonArray jsonArray;
// 填充 jsonArray ...
QJsonDocument jsonDoc(jsonArray);
// 将QJsonObject添加到QJsonArray数组中
QJsonArray tasksArray
tasksArray.append(QJsonObject);
QJsonDocument
转QJsonArray
:
如果 QJsonDocument 包含的是一个 QJsonArray,你可以通过其 array() 方法来获取它。
QJsonDocument jsonDoc = QJsonDocument::fromJson(someByteArray);
if (!jsonDoc.isNull() && jsonDoc.isArray()) {
QJsonArray jsonArray = jsonDoc.array();
}
3、QJsonDocument
/QJsonObject
与 QByteArray
的转换
QJsonDocument
转QByteArray
:
使用QJsonDocument
的 toJson() 方法可以将其序列化为一个QByteArray
。
QJsonDocument jsonDoc;
// 填充 jsonDoc ...
QByteArray jsonByteArray = jsonDoc.toJson(QJsonDocument::Compact); // Compact 表示生成紧凑的JSON字符串,减小内存
// 将QJsonObject转换为QByteArray
QJsonObject jsonInfo;
QByteArray algByte = QJsonDocument(jsonInfo).toJson(); // 查看单一模块数据
- 转
QByteArray
转QJsonDocument
使用 QJsonDocument::fromJson() 静态方法可以从一个QByteArray
中解析出一个QJsonDocument
。
QByteArray jsonByteArray;
// 填充 jsonByteArray ...
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonByteArray);
4、QByteArray
与其他类型的直接转换
QByteArray 通常不与 QJsonObject 或 QJsonArray 直接转换,而是通过与 QJsonDocument 的中介来实现。这是因为 QJsonObject 和 QJsonArray 是表示JSON数据结构的类,而 QByteArray 是表示字节序列的类。
二. JSON数据的压缩
以Halcon图像为例:
思路:将Halcon图像转换成QByteArray
类型数据,然后使用Qt
的qCompress方法进行压缩,再通过qUncompress解压。
压缩:
int main(){
//导出任务过大 所以对图像进行裁剪压缩处理-20250222-lw
HObject domain, RegionDifference, dilationRegion, modelImage, modelRegion;
Difference(m_matchGraphicsData.m_Region.at(MODELCON), m_matchGraphicsData.m_Region.at(MODELEXC), &modelRegion);
//膨胀一下,得到一些模板区域以外的图像,避免创建模板留下黑边
DilationCircle(modelRegion, &dilationRegion, 30);
// 获取图像中模板以外的区域进行绘制
GetDomain(m_matchGraphicsData.m_modelImage, &domain);
Difference(domain, dilationRegion, &RegionDifference);
PaintRegion(RegionDifference, m_matchGraphicsData.m_modelImage, &modelImage, 0, "fill");
// 压缩图像数据
MN_Commontools::serializeHImage(modelImage, imgStr);
// 解压图像数据
MN_Commontools::deSerializeHImage(imgStr, modelImage);
}
void MN_Commontools::serializeHImage(const HImage& _img, QString& _base64Str)
{
HSerializedItem imgItem;
Hlong _imgSize;
imgItem = _img.SerializeImage();
void* imgBegin = imgItem.GetSerializedItemPtr(&_imgSize);
QByteArray ba;
QBuffer buf(&ba);
buf.setData((char*)imgBegin, _imgSize);
int beginDataSize = ba.toBase64().size();
//对图像进行压缩lw
QByteArray compressedData = qCompress(ba, 9); // 直接压缩原始数据
_base64Str = QString::fromLatin1(compressedData.toBase64()); // 将压缩后的数据转换为 Base64 编码的 QString
int qCompressDataSize = _base64Str.toBase64().size();
}
解压:
void MN_Commontools::deSerializeHImage(const QString& _base64Str, HImage& _img)
{
QByteArray arr_base64 = _base64Str.toLatin1();
int uncompressedDataSize = arr_base64.size();
//20250224 对压缩图像进行解压lw
QByteArray compressedData = QByteArray::fromBase64(arr_base64); // 将 Base64 编码的 QByteArray 解码为原始的压缩二进制数据
QByteArray arr_default = qUncompress(compressedData); // 解压缩数据
int uncompressedDataSize1 = arr_default.size();
//兼顾未压缩的老任务,解压失败还是直接读取原任务
if (arr_default.size() == 0)
arr_default = QByteArray::fromBase64(arr_base64);
char* charPtr = arr_default.data();
int charSize = arr_default.length();
HSerializedItem imgItem;
try
{
imgItem.CreateSerializedItemPtr(charPtr, charSize, "true");
_img.DeserializeImage(imgItem);
}
catch (const HException& e)
{
// INFO_VISION("%s,%s", e.ProcName().Text(), e.ErrorMessage().Text());
}
}
注意:压缩后的QByteArray图像数据不能转换成QJsonObject 类型,否则会为空。
下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。 |