使用QT遍历Json文档及搜索子对象
关于qt遍历Json文档的代码,整理并记录在这里,方便以后使用。
QT 的版本如下图
Json文件内容:
{"动物": {"人": {"年龄": 43,"电话": ["+123 12345678","+321 87654321"]},"狗": {"腿": ["左前腿","右前腿","左后腿","右后腿"],"头": {"眼睛": 2,"鼻子": 1,"耳朵": 2}}}
}
使用QJsonDocument遍历所有对象的输出如下:
"" "根" isObject() 有 1 个子对象
" " "动物" isObject() 有 2 个子对象
" " "人" isObject() 有 2 个子对象
" " "年龄" isDouble() 43
" " "电话" isArray() 有 2 个子对象
" " "" isString() "+123 12345678"
" " "" isString() "+321 87654321"
" " "狗" isObject() 有 2 个子对象
" " "头" isObject() 有 3 个子对象
" " "眼睛" isDouble() 2
" " "耳朵" isDouble() 2
" " "鼻子" isDouble() 1
" " "腿" isArray() 有 4 个子对象
" " "" isString() "左前腿"
" " "" isString() "右前腿"
" " "" isString() "左后腿"
" " "" isString() "右后腿"
遍历并输出Json对象的代码:
//加载Json文件 static void LoadJsonFromFile(const QString& jsonfilename,QJsonDocument& jsDoc){QFile file(jsonfilename);file.open(QIODevice::ReadWrite);QByteArray json = file.readAll();jsDoc = QJsonDocument::fromJson(json);}//遍历输出Json对象//输入是Json文档static void PrintJson(QJsonDocument& jDoc){if(jDoc.isObject()) {QJsonObject jObject = jDoc.object(); //获得根对象PrintJsonObject(jObject,"根");}else if(jDoc.isArray()){QJsonArray jArray = jDoc.array();PrintJsonArray(jArray,"");}else{//空文档qDebug() << "空文档";}}//遍历QJsonObjectstatic void PrintJsonObject(QJsonObject& obj,const QString& key,int retract=0){//输出使用的缩进QString tabs = "";for(int i=0;i<retract;++i) {tabs+=" ";}qDebug() << tabs << key << "isObject() 有 " << obj.size() << " 个子对象 ";for(const QString& key: obj.keys()) //遍历所有的key{QJsonValue jvalue = obj[key];PrintJsonValue(jvalue,key,retract+1); //打印输出QJsonValue}}//遍历QJsonArraystatic void PrintJsonArray(QJsonArray& arr,const QString& key,int retract=0){//输出使用的缩进QString tabs = "";for(int i=0;i<retract;++i) {tabs+=" ";}qDebug() << tabs << key << "isArray() 有 " << arr.size() << " 个子对象 ";for(QJsonArray::iterator it=arr.begin();it!=arr.end();++it) //遍历数组内的对象{QJsonValue jvalue = *it;PrintJsonValue(jvalue,"",retract+1); //打印输出QJsonValue}}//打印输出QJsonValuestatic void PrintJsonValue(QJsonValue& jvalue,const QString& key,int retract=0){//输出使用的缩进QString tabs = "";for(int i=0;i<retract;++i) {tabs+=" ";}if(jvalue.isArray()){QJsonArray childArray = jvalue.toArray();PrintJsonArray(childArray,key,retract); //递归调用}else if(jvalue.isObject()){QJsonObject childObject = jvalue.toObject();PrintJsonObject(childObject,key,retract); //递归调用}else if(jvalue.isBool()){qDebug() << tabs << key << " isBool() " << jvalue.toBool();}else if(jvalue.isDouble()){qDebug() << tabs << key << " isDouble() " << jvalue.toDouble();}else if(jvalue.isString()){qDebug() << tabs << key << " isString() " << jvalue.toString();}else if(jvalue.isUndefined()){qDebug() << tabs << " isUndefined() ";}else if(jvalue.isNull()){qDebug() << tabs << " isNull() ";}}//测试代码QJsonDocument doc; ZJsonTools::LoadJsonFromFile(QString("json文件的完整路径名称"),doc);ZJsonTools::PrintJson(doc);
搜索Json的代码:
static bool SearchJsonValue(const QJsonObject& jObject,const QStringList& path,QJsonValue& result){QJsonValue jValue = jObject;return SearchJsonValue(jValue,path,result);}static bool SearchJsonValue(const QJsonValue& jValue,const QStringList& path,QJsonValue& result){result = jValue;for(int i=0;i<path.length();++i){result = result[path[i]];if(result.isNull() || result.isUndefined()){return false;}}return true;}//测试代码QStringList path = {"动物","狗","头","鼻子"};QJsonObject jObject = doc.object();QJsonValue jObj;if(ZJsonTools::SearchJsonValue(jObject,path,jObj)){qDebug()<< " 狗鼻子的数量: " << jObj.toInt();}else{qDebug()<< " 未找到 ";}
搜索Json测试代码输出:
狗鼻子的数量: 1
完整的ZJsonTools类代码:
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
#include <QJsonArray>
#include <QString>
#include <QFile>
#include <QList>
#include <QDebug>class ZJsonTools final
{
private:ZJsonTools();public:static void LoadJsonFromFile(const QString& jsonfilename,QJsonDocument& jsDoc){QFile file(jsonfilename);file.open(QIODevice::ReadWrite);QByteArray json = file.readAll();jsDoc = QJsonDocument::fromJson(json);}static void PrintJson(QJsonDocument& jDoc){if(jDoc.isObject()){QJsonObject jObject = jDoc.object();PrintJsonObject(jObject,"根");}else if(jDoc.isArray()){QJsonArray jArray = jDoc.array();PrintJsonArray(jArray,"");}else{//空文档qDebug() << "空文档";}}static bool SearchJsonValue(const QJsonObject& jObject,const QStringList& path,QJsonValue& result){QJsonValue jValue = jObject;return SearchJsonValue(jValue,path,result);}static bool SearchJsonValue(const QJsonValue& jValue,const QStringList& path,QJsonValue& result){result = jValue;for(int i=0;i<path.length();++i){result = result[path[i]];if(result.isNull() || result.isUndefined()){return false;}}return true;}private:static void PrintJsonObject(QJsonObject& obj,const QString& key,int retract=0){//输出使用的缩进QString tabs = "";for(int i=0;i<retract;++i) {tabs+=" ";}qDebug() << tabs << key << "isObject() 有 " << obj.size() << " 个子对象 ";for(const QString& key: obj.keys()){QJsonValue jvalue = obj[key];PrintJsonValue(jvalue,key,retract+1);}}static void PrintJsonArray(QJsonArray& arr,const QString& key,int retract=0){//输出使用的缩进QString tabs = "";for(int i=0;i<retract;++i) {tabs+=" ";}qDebug() << tabs << key << "isArray() 有 " << arr.size() << " 个子对象 ";for(QJsonArray::iterator it=arr.begin();it!=arr.end();++it){QJsonValue jvalue = *it;PrintJsonValue(jvalue,"",retract+1);}}static void PrintJsonValue(QJsonValue& jvalue,const QString& key,int retract=0){//输出使用的缩进QString tabs = "";for(int i=0;i<retract;++i) {tabs+=" ";}if(jvalue.isArray()){QJsonArray childArray = jvalue.toArray();PrintJsonArray(childArray,key,retract);}else if(jvalue.isObject()){QJsonObject childObject = jvalue.toObject();PrintJsonObject(childObject,key,retract);}else if(jvalue.isBool()){qDebug() << tabs << key << " isBool() " << jvalue.toBool();}else if(jvalue.isDouble()){qDebug() << tabs << key << " isDouble() " << jvalue.toDouble();}else if(jvalue.isString()){qDebug() << tabs << key << " isString() " << jvalue.toString();}else if(jvalue.isUndefined()){qDebug() << tabs << " isUndefined() ";}else if(jvalue.isNull()){qDebug() << tabs << " isNull() ";}}};
使用QT遍历Json文档及搜索子对象相关推荐
- C#.Net 使用 JsonReader/JsonWriter 高性能解析/生成 Json 文档
Swifter.Json 是由本人编写的高性能且多功能的 Json 解析库.下图是 Swifter.Json 与 .Net 平台上的其他 Json 库性能对比: 在 Swifter.Json 近期更新 ...
- Qt 读取XML文档的简单示例
目录名字 XML简介 Qt 操作XML文档一般方法 使用DOM读取XML文档 示例代码:读取XML文档 XML简介 XML(Extensible Markup Language,可扩展标记语言)是一种 ...
- [Xcode 实际操作]七、文件与数据-(17)解析JSON文档
目录:[Swift]Xcode实际操作 本文将演示如何解析JSON文档. 项目中已添加一份JSON文档:menu.json 1 { 2 "menu": 3 { 4 "id ...
- 【QCustomPlot】1.1 - Qt .qch帮助文档导入使用
上一篇说过,QCustomPlot下载后的文件中是有帮助文档的. 在 documentation 文件夹下,qcustomplot.qch,就是这么个鬼东东. 作为一名合格的API工程师,导入帮助文档 ...
- 【项目】---文档快速搜索工具
目录 一.项目背景 二.项目需求分析 三.项目涉及的知识点 四.项目实现的基础理论 五.项目框架 六.增加系统工具模块 6.1.扫描本地的文件的功能 七.增加数据管理模块 7.1.先了解数据库sqli ...
- 项目 - 文档快速搜索工具
一.项目简介: Linux操作系统中提供了find指令查找指定文件,为了实现在Windows操作系统中实现文件的快搜搜索,利用所学知识实现文件搜索工具,与软件everything工具具有一定的相同功能 ...
- 用C#实现在PowerPoint文档中搜索文本
用编程的方式根据对象模型很容易实现在Word.Excel文档中搜索文本,在PowerPoint里面也同样如此,使用对象模型有助于我们了解office的文档结构. 搜索的思路和方法基本是一样的,用Pow ...
- Collection+JSON 文档
Collection+JSON 文档 对于这个设计,我们不再以可能的状态和转移为起点,相反,我们将从一个集合状态响应中可能元素的顶层布局开始.从这一点入手,其他细节可以随着设计向超媒体类型最底层属性的 ...
- php循环获取xml节点,PHP_PHP遍历XML文档所有节点的方法,本文实例讲述了PHP遍历XML文档 - phpStudy...
PHP遍历XML文档所有节点的方法 本文实例讲述了PHP遍历XML文档所有节点的方法.分享给大家供大家参考.具体实现方法如下: 1. contact.xml代码: J J J Manager Nati ...
- QT读取Word文档
Word文档读取 开发工具与关键技术:QtCreator.C++ 作者:何任贤 撰写时间:2020年06月02日 Word文档读取 我们先要在工程文件加入 QT += axcontainer 我们要用 ...
最新文章
- RPC-原理及RPC实例分析
- LeetCode 923. 3Sum With Multiplicity
- oauth过滤login_OAuth2AuthenticationProcessingFilter资源认证服务器过滤器
- Android 设置EditText光标Cursor颜色及粗细
- 理解Linux系统中的load average(图文版)转载
- 解决git@github.com: Permission denied (publickey). fatal: Could not read from remote repository. Pleas
- [JavaWeb-HTTP]HTTP概念
- php一行多个商品,【后端开发】php一行展示多个商品怎么实现
- tkinter label_tkinter做一个简易提词板
- 百度黑莓宣布联手搞自动驾驶,QNX系统成Apollo平台基础
- sed基本用法 sed文本块处理 、 sed高级应用
- 【转】iphone开发中NSMutableAttributedString/NSAttributedString 富文本设置
- eclipse 添加jar (servlet api)
- 转:Rust 调用C/C++
- base上海 Ai建筑设计 Python招聘ing
- 朗强:连接电脑的HDMI线输入电视上没有反应是什么原因?
- 如何开通微信商城?微商城的开通方法?
- 【数据结构】格洛克怎么上膛?栈的结构帮你解答!
- 【软考软件评测师】2015年下案例分析历年真题
- List的remove()方法避坑
热门文章
- Amlogic S905X3外设驱动之RTC驱动:HYM8563驱动
- amd显卡用黑苹果输出黑屏_黑苹果XFX讯景显卡刷vBIOS教程,使其黑苹果显卡更稳定完美,不再黑屏...
- 如何优化MySQL千万级大表,我写了6000字的解读
- 【CPRI协议v7.0】CPRI 8b/10b编码Scrambling功能
- 2021年高热度排行前十名进销存管理软件
- ydui时间组件报错nvalid prop: custom validator check failed for prop “startDate“.
- 机器学习必学十大算法
- 腾讯云域名购买和域名解析教程
- radon变换的原理-通过直线方程式的计算来检测出直线
- 简单英译汉SQL脚本