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

相关文章

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

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

Qt之QMessageBox的具体使用

《Qt之QMessageBox的具体使用》本文介绍Qt中QMessageBox类的使用,用于弹出提示、警告、错误等模态对话框,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.简单介绍3.常见函数4.按钮类型(QMessage::StandardButton)5.分步骤实现弹窗6.总结1.引言