Qt扫盲-QJsonDocument理论总结

2023-10-16 20:36

本文主要是介绍Qt扫盲-QJsonDocument理论总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

QJsonDocument理论总结

  • 一、概述
  • 二、 QJsonDocument 的转换
  • 三、常用操作

一、概述

QJsonDocument类提供了一种读写JSON文档的方法。QJsonDocument是一个包装完整JSON文档的类,可以从基于UTF-8编码的文本表示Qt自己的二进制格式读写该文档。所谓的JSON文档指的是就是一个我们能看到的用JSON语法构成的文档。比如下面的文本几种形式

  • 纯对象JSON文档
{"id": 28849,"code": 49497,"message": "Magnam beatae dolores voluptatem. "
}
  • 基础数组JSON文档
["http://dummyimage.com/190x428.png/595f0e/5a6b24","http://dummyimage.com/477x397.png/2a6041/451d77","http://dummyimage.com/209x243.png/557f66/2b597b","http://dummyimage.com/411x476.png/7d545b/6c615e"
]
  • 对象数组JSON文档
[{"userName": "Julio Hoeger","uid": "9520e843-4548-4dfa-a2a4-f3ac3c14cce8"},"我是普通文本~",{"userName": "Julio Hoeger","uid": "9520e843-4548-4dfa-a2a4-f3ac3c14cce8"},"我是普通文本~",{"userName": "Julio Hoeger","uid": "9520e843-4548-4dfa-a2a4-f3ac3c14cce8"},"我是普通文本~",{"userName": "Julio Hoeger","uid": "9520e843-4548-4dfa-a2a4-f3ac3c14cce8"},"我是普通文本~"
]
  • 混合JSON文档
{"total": 200,"data": [{"avatar": "http://dummyimage.com/498x200.png/6e4a6b/247832","logo": "http://dummyimage.com/100x200.png/0a257b/2a1f0c","email": "Mitchell.Rowe51@gmail.com","userName": "Bradford Prosacco","createAt": 1438303106566,"birthday": "06/01/2018 05:15","age": 11055,"price": 91378.31,"homePage": "https://skylar-utools.info","phoneNumber": "15096075236","city": "Fayetteville 6498 Alexandrea Shoals","workAt": "Altenwerth - Stracke","uid": "37c07e07-4713-46e1-881f-3217bb362209","description": "Eveniet quia quam eos non. Dolorem consectetur neque beatae cumque. Voluptatibus possimus placeat illo in eligendi et. Vel corrupti ipsum et voluptatum eum ullam molestiae maiores. Est a rerum sint et vitae et expedita. Sed minus quia quo minima. Exercitationem laboriosam corrupti id. Sed magni itaque laboriosam. Dicta eum nisi sit. Ad in accusantium quisquam praesentium. Error iste sed.","idNo": "372337200906168349","socialCode": "U43208743DQUE95M69"},{"avatar": "http://dummyimage.com/444x260.png/777366/581a70","logo": "http://dummyimage.com/100x200.png/5d343a/772c02","email": "Edd.Nolan@gmail.com","userName": "Arnold Gaylord","createAt": 1189591090933,"birthday": "06/13/2019 00:49","age": 6715,"price": 67365.55,"homePage": "http://lottie-utools.info","phoneNumber": "19610566837","city": "East Heath 22339 Stokes Summit","workAt": "Feil LLC","uid": "33039d4d-a1a4-4c95-a993-ef0d7b059a9a","description": "Unde facilis qui sapiente rem nemo consequatur beatae consequatur sed. Qui veritatis non ipsam qui consequuntur suscipit deleniti. Iusto doloribus quidem quas ea ut modi eos qui sit. Quisquam sunt neque iure qui quasi aut fugit atque ut. Ratione officia qui qui consequatur corporis esse et. Sit omnis est occaecati. Aliquam quidem soluta quia et cum cumque rerum et qui. Dolores ratione est aspernatur voluptates. Rem sunt culpa omnis voluptas deserunt non alias et quibusdam. Eveniet porro magni laborum. Consequatur fugiat illum voluptatem eos beatae quia exercitationem hic omnis. Omnis cupiditate at aliquam ut quo. Et ducimus aperiam.","idNo": "911779201611114210","socialCode": "M4731779YDWPKTK49Q"},{"avatar": "http://dummyimage.com/189x114.png/085e64/417806","logo": "http://dummyimage.com/100x200.png/6c7c00/565c4d","email": "Cecelia.Sauer96@hotmail.com","userName": "Theodore Price","createAt": 1355674989157,"birthday": "07/26/2015 20:02","age": 39166,"price": 78955.78,"homePage": "http://jay-utools.net","phoneNumber": "15615929019","city": "New Gayle 598 Kaycee Brooks","workAt": "Prohaska - Ratke","uid": "8128feca-d4f0-454d-8816-f7bfa97d73b4","description": "Maxime aut in laudantium aspernatur qui magni quibusdam. Quam nemo iusto fugiat repudiandae illum pariatur. Ut ipsum harum occaecati laboriosam animi sed voluptatem nesciunt. Inventore sapiente ipsum et. Dicta qui consectetur blanditiis autem. Veritatis a ut repellendus quis ea. Voluptatem quidem repellendus amet id perspiciatis. Excepturi sit expedita saepe enim itaque sint voluptates adipisci accusamus. Dicta debitis et omnis quia labore et non vel. Mollitia atque aut. Nihil autem ut magni voluptas facilis laudantium. Sequi vero omnis consequatur eum nostrum. Maxime voluptatem natus ut.","idNo": "989485201610058582","socialCode": "GG833760PE3LE3TFF9"}]
}

二、 QJsonDocument 的转换

我们可以使用QJsonDocument::fromJson()将JSON文档从基于文本的表示形式转换为QJsonDocument。toJson()将其转换回文本。解析器非常快速和有效,并将JSON转换为Qt使用的二进制表示形式。

我们还可以使用 fromBinaryData() 或 fromRawData() 从存储的二进制表示创建文档。

  • fromBinaryData(const QByteArray &data, QJsonDocument::DataValidation validation = Validate)

  • fromRawData(const char *data, int size, QJsonDocument::DataValidation validation = Validate)

  • fromJson(const QByteArray &json, QJsonParseError *error = nullptr)
    这个函数将json解析为UTF-8编码的json文档,并从中创建QJsonDocument。也是最常用的
    如果解析成功,返回一个有效的(非空的)QJsonDocument。如果失败,返回的文档将为空,我们还可以通过解析error变量去查询错误的详细信息。

  • fromVariant(const QVariant &variant)
    这个也用的很多,从QVariant 对象创建一个QJsonDocument。这个对象支持的只有如下类,
    如果变量包含 QVariantMap、QVariantHash、QVariantList 或 QStringList 以外的任何类型,则返回的文档无效。

1. 从字符串中转换出 QJsonDocument 示例代码:

  • 目标JSON:
{"total": 200,"data": [{"avatar": "http://dummyimage.com/498x200.png/6e4a6b/247832","logo": "http://dummyimage.com/100x200.png/0a257b/2a1f0c","email": "Mitchell.Rowe51@gmail.com","userName": "Bradford Prosacco","createAt": 1438303106566,"birthday": "06/01/2018 05:15","age": 11055,"price": 91378.31,"homePage": "https://skylar-utools.info","phoneNumber": "15096075236","city": "Fayetteville 6498 Alexandrea Shoals","workAt": "Altenwerth - Stracke","uid": "37c07e07-4713-46e1-881f-3217bb362209","description": "Eveniet quia quam eos non. Dolorem consectetur neque beatae cumque. Voluptatibus possimus placeat illo in eligendi et. Vel corrupti ipsum et voluptatum eum ullam molestiae maiores. Est a rerum sint et vitae et expedita. Sed minus quia quo minima. Exercitationem laboriosam corrupti id. Sed magni itaque laboriosam. Dicta eum nisi sit. Ad in accusantium quisquam praesentium. Error iste sed.","idNo": "372337200906168349","socialCode": "U43208743DQUE95M69"},{"avatar": "http://dummyimage.com/444x260.png/777366/581a70","logo": "http://dummyimage.com/100x200.png/5d343a/772c02","email": "Edd.Nolan@gmail.com","userName": "Arnold Gaylord","createAt": 1189591090933,"birthday": "06/13/2019 00:49","age": 6715,"price": 67365.55,"homePage": "http://lottie-utools.info","phoneNumber": "19610566837","city": "East Heath 22339 Stokes Summit","workAt": "Feil LLC","uid": "33039d4d-a1a4-4c95-a993-ef0d7b059a9a","description": "Unde facilis qui sapiente rem nemo consequatur beatae consequatur sed. Qui veritatis non ipsam qui consequuntur suscipit deleniti. Iusto doloribus quidem quas ea ut modi eos qui sit. Quisquam sunt neque iure qui quasi aut fugit atque ut. Ratione officia qui qui consequatur corporis esse et. Sit omnis est occaecati. Aliquam quidem soluta quia et cum cumque rerum et qui. Dolores ratione est aspernatur voluptates. Rem sunt culpa omnis voluptas deserunt non alias et quibusdam. Eveniet porro magni laborum. Consequatur fugiat illum voluptatem eos beatae quia exercitationem hic omnis. Omnis cupiditate at aliquam ut quo. Et ducimus aperiam.","idNo": "911779201611114210","socialCode": "M4731779YDWPKTK49Q"},{"avatar": "http://dummyimage.com/189x114.png/085e64/417806","logo": "http://dummyimage.com/100x200.png/6c7c00/565c4d","email": "Cecelia.Sauer96@hotmail.com","userName": "Theodore Price","createAt": 1355674989157,"birthday": "07/26/2015 20:02","age": 39166,"price": 78955.78,"homePage": "http://jay-utools.net","phoneNumber": "15615929019","city": "New Gayle 598 Kaycee Brooks","workAt": "Prohaska - Ratke","uid": "8128feca-d4f0-454d-8816-f7bfa97d73b4","description": "Maxime aut in laudantium aspernatur qui magni quibusdam. Quam nemo iusto fugiat repudiandae illum pariatur. Ut ipsum harum occaecati laboriosam animi sed voluptatem nesciunt. Inventore sapiente ipsum et. Dicta qui consectetur blanditiis autem. Veritatis a ut repellendus quis ea. Voluptatem quidem repellendus amet id perspiciatis. Excepturi sit expedita saepe enim itaque sint voluptates adipisci accusamus. Dicta debitis et omnis quia labore et non vel. Mollitia atque aut. Nihil autem ut magni voluptas facilis laudantium. Sequi vero omnis consequatur eum nostrum. Maxime voluptatem natus ut.","idNo": "989485201610058582","socialCode": "GG833760PE3LE3TFF9"}]
}
  • 解析代码:
//定义的 json字符串
QString m_data = R"({"total":200,"data":[{"avatar":"http://dummyimage.com/498x200.png/6e4a6b/247832","logo":"http://dummyimage.com/100x200.png/0a257b/2a1f0c","email":"Mitchell.Rowe51@gmail.com","userName":"Bradford Prosacco","createAt":1438303106566,"birthday":"06/01/2018 05:15","age":11055,"price":91378.31,"homePage":"https://skylar-utools.info","phoneNumber":"15096075236","city":"Fayetteville 6498 Alexandrea Shoals","workAt":"Altenwerth - Stracke","uid":"37c07e07-4713-46e1-881f-3217bb362209","description":"Eveniet quia quam eos non. Dolorem consectetur neque beatae cumque. Voluptatibus possimus placeat illo in eligendi et. Vel corrupti ipsum et voluptatum eum ullam molestiae maiores. Est a rerum sint et vitae et expedita. Sed minus quia quo minima. Exercitationem laboriosam corrupti id. Sed magni itaque laboriosam. Dicta eum nisi sit. Ad in accusantium quisquam praesentium. Error iste sed.","idNo":"372337200906168349","socialCode":"U43208743DQUE95M69"},{"avatar":"http://dummyimage.com/444x260.png/777366/581a70","logo":"http://dummyimage.com/100x200.png/5d343a/772c02","email":"Edd.Nolan@gmail.com","userName":"Arnold Gaylord","createAt":1189591090933,"birthday":"06/13/2019 00:49","age":6715,"price":67365.55,"homePage":"http://lottie-utools.info","phoneNumber":"19610566837","city":"East Heath 22339 Stokes Summit","workAt":"Feil LLC","uid":"33039d4d-a1a4-4c95-a993-ef0d7b059a9a","description":"Unde facilis qui sapiente rem nemo consequatur beatae consequatur sed. Qui veritatis non ipsam qui consequuntur suscipit deleniti. Iusto doloribus quidem quas ea ut modi eos qui sit. Quisquam sunt neque iure qui quasi aut fugit atque ut. Ratione officia qui qui consequatur corporis esse et. Sit omnis est occaecati. Aliquam quidem soluta quia et cum cumque rerum et qui. Dolores ratione est aspernatur voluptates. Rem sunt culpa omnis voluptas deserunt non alias et quibusdam. Eveniet porro magni laborum. Consequatur fugiat illum voluptatem eos beatae quia exercitationem hic omnis. Omnis cupiditate at aliquam ut quo. Et ducimus aperiam.","idNo":"911779201611114210","socialCode":"M4731779YDWPKTK49Q"},{"avatar":"http://dummyimage.com/189x114.png/085e64/417806","logo":"http://dummyimage.com/100x200.png/6c7c00/565c4d","email":"Cecelia.Sauer96@hotmail.com","userName":"Theodore Price","createAt":1355674989157,"birthday":"07/26/2015 20:02","age":39166,"price":78955.78,"homePage":"http://jay-utools.net","phoneNumber":"15615929019","city":"New Gayle 598 Kaycee Brooks","workAt":"Prohaska - Ratke","uid":"8128feca-d4f0-454d-8816-f7bfa97d73b4","description":"Maxime aut in laudantium aspernatur qui magni quibusdam. Quam nemo iusto fugiat repudiandae illum pariatur. Ut ipsum harum occaecati laboriosam animi sed voluptatem nesciunt. Inventore sapiente ipsum et. Dicta qui consectetur blanditiis autem. Veritatis a ut repellendus quis ea. Voluptatem quidem repellendus amet id perspiciatis. Excepturi sit expedita saepe enim itaque sint voluptates adipisci accusamus. Dicta debitis et omnis quia labore et non vel. Mollitia atque aut. Nihil autem ut magni voluptas facilis laudantium. Sequi vero omnis consequatur eum nostrum. Maxime voluptatem natus ut.","idNo":"989485201610058582","socialCode":"GG833760PE3LE3TFF9"}]})";void QJsonUse::testJsonDocument()
{//把 QString 转换为 QJsonDocument QJsonDocument doc = QJsonDocument::fromJson(m_data.toLocal8Bit());if(doc.isNull() || doc.isEmpty()){qDebug()<<"[info] : document maybe null or empty";}else{if(doc.isObject()){qDebug()<<"[info] : documen is an object";QJsonObject obj = doc.object();if(obj.contains("total")){qDebug()<<tr("total = %1").arg(obj.value("total").toInt());}if(obj.contains("data")){qDebug()<<tr("data{");QJsonArray data_array = obj.value("data").toArray();foreach (auto item, data_array) {if(!item.isObject())   continue;QJsonObject m_object = item.toObject();if(m_object.contains("avatar"))    qDebug()<<"\tavatar = "<<m_object.value("avatar").toString();if(m_object.contains("logo"))    qDebug()<<"\tlogo = "<<m_object.value("logo").toString();if(m_object.contains("email"))    qDebug()<<"\temail = "<<m_object.value("email").toString();if(m_object.contains("userName"))    qDebug()<<"\tuserName = "<<m_object.value("userName").toString();if(m_object.contains("createAt"))    qDebug()<<"\tcreateAt = "<<m_object.value("createAt").toString();if(m_object.contains("birthday"))    qDebug()<<"\tbirthday = "<<m_object.value("birthday").toString();if(m_object.contains("age"))    qDebug()<<"\tage = "<<m_object.value("age").toInt();if(m_object.contains("price"))    qDebug()<<"\tprice = "<<m_object.value("price").toDouble();if(m_object.contains("homePage"))    qDebug()<<"\thomePage = "<<m_object.value("homePage").toString();if(m_object.contains("phoneNumber"))    qDebug()<<"\tphoneNumber = "<<m_object.value("phoneNumber").toString();if(m_object.contains("city"))    qDebug()<<"\tcity = "<<m_object.value("city").toString();if(m_object.contains("workAt"))    qDebug()<<"\tworkAt = "<<m_object.value("workAt").toString();if(m_object.contains("uid"))    qDebug()<<"\tuid = "<<m_object.value("uid").toString();if(m_object.contains("description"))    qDebug()<<"\tdescription = "<<m_object.value("description").toString();if(m_object.contains("idNo"))    qDebug()<<"\tidNo = "<<m_object.value("idNo").toString();if(m_object.contains("socialCode"))    qDebug()<<"\tsocialCode = "<<m_object.value("socialCode").toString() <<"\n";}qDebug()<<tr("}");}}if(doc.isArray()){qDebug()<<"documen is an array";}}
}

2. 从QVariantMap 对象获取

  • 目标JSON:
{"addr": ["ew","ew","fd"],"code": 203,"code": 203,"id": 1,"info": {"age": 39166,"avatar": "http://dummyimage.com/189x114.png/085e64/417806","createAt": 1355674989157,"email": "Cecelia.Sauer96@hotmail.com","logo": "http://dummyimage.com/100x200.png/6c7c00/565c4d","userName": "Theodore Price"}
}
  • 合成代码:
void QJsonUse::testJsonDocumentFromQVarientMap()
{QMap<QString, QVariant> topMap;QMap<QString, QVariant> secondMap;secondMap.insert("avatar", "http://dummyimage.com/189x114.png/085e64/417806");secondMap.insert("logo", "http://dummyimage.com/100x200.png/6c7c00/565c4d");secondMap.insert("email", "Cecelia.Sauer96@hotmail.com");secondMap.insert("userName", "Theodore Price");secondMap.insert("createAt", 1355674989157);secondMap.insert("age", 39166);topMap.insert("id", 1);topMap.insert("code", 203);topMap.insert("addr", QVariant(QList<QString>{"ew", "ew", "fd"}));topMap.insert("info", secondMap);QJsonDocument doc = QJsonDocument::fromVariant(QVariant(topMap));qDebug()<<doc.toJson(QJsonDocument::Indented).data();
}

三、常用操作

为了安全起见,我们最好在使用 Json的时候一定要去校验JSON的正确性,

isNull() 可以查询已解析Json文档的有效性。isEmpty() 是去查看已经解析Json是否是空数据

我们还可以使用 isArray()isObject() 查询文档是否包含数组或对象。

然后就是使用 array()object() 检索文档中包含的数组或对象,然后读取或操作。

我们可以使用 toJson() 把这个Json对象转换为字符串,还可以知道是否是压缩或者展开的格式

//展开格式
{"Array": [true,999,"string"],"Key": "Value","null": null
}//压缩格式 QJsonDocument::Compact
{"Array":[true,999,"string"],"Key":"Value","null":null}

也可以使用 toVariant() 将JSON对象直接转换为 QVariant类型

这篇关于Qt扫盲-QJsonDocument理论总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/220636

相关文章

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi