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

相关文章

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro