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

相关文章

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho