关于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文档及搜索子对象相关推荐

  1. C#.Net 使用 JsonReader/JsonWriter 高性能解析/生成 Json 文档

    Swifter.Json 是由本人编写的高性能且多功能的 Json 解析库.下图是 Swifter.Json 与 .Net 平台上的其他 Json 库性能对比: 在 Swifter.Json 近期更新 ...

  2. Qt 读取XML文档的简单示例

    目录名字 XML简介 Qt 操作XML文档一般方法 使用DOM读取XML文档 示例代码:读取XML文档 XML简介 XML(Extensible Markup Language,可扩展标记语言)是一种 ...

  3. [Xcode 实际操作]七、文件与数据-(17)解析JSON文档

    目录:[Swift]Xcode实际操作 本文将演示如何解析JSON文档. 项目中已添加一份JSON文档:menu.json 1 { 2 "menu": 3 { 4 "id ...

  4. 【QCustomPlot】1.1 - Qt .qch帮助文档导入使用

    上一篇说过,QCustomPlot下载后的文件中是有帮助文档的. 在 documentation 文件夹下,qcustomplot.qch,就是这么个鬼东东. 作为一名合格的API工程师,导入帮助文档 ...

  5. 【项目】---文档快速搜索工具

    目录 一.项目背景 二.项目需求分析 三.项目涉及的知识点 四.项目实现的基础理论 五.项目框架 六.增加系统工具模块 6.1.扫描本地的文件的功能 七.增加数据管理模块 7.1.先了解数据库sqli ...

  6. 项目 - 文档快速搜索工具

    一.项目简介: Linux操作系统中提供了find指令查找指定文件,为了实现在Windows操作系统中实现文件的快搜搜索,利用所学知识实现文件搜索工具,与软件everything工具具有一定的相同功能 ...

  7. 用C#实现在PowerPoint文档中搜索文本

    用编程的方式根据对象模型很容易实现在Word.Excel文档中搜索文本,在PowerPoint里面也同样如此,使用对象模型有助于我们了解office的文档结构. 搜索的思路和方法基本是一样的,用Pow ...

  8. Collection+JSON 文档

    Collection+JSON 文档 对于这个设计,我们不再以可能的状态和转移为起点,相反,我们将从一个集合状态响应中可能元素的顶层布局开始.从这一点入手,其他细节可以随着设计向超媒体类型最底层属性的 ...

  9. php循环获取xml节点,PHP_PHP遍历XML文档所有节点的方法,本文实例讲述了PHP遍历XML文档 - phpStudy...

    PHP遍历XML文档所有节点的方法 本文实例讲述了PHP遍历XML文档所有节点的方法.分享给大家供大家参考.具体实现方法如下: 1. contact.xml代码: J J J Manager Nati ...

  10. QT读取Word文档

    Word文档读取 开发工具与关键技术:QtCreator.C++ 作者:何任贤 撰写时间:2020年06月02日 Word文档读取 我们先要在工程文件加入 QT += axcontainer 我们要用 ...

最新文章

  1. RPC-原理及RPC实例分析
  2. LeetCode 923. 3Sum With Multiplicity
  3. oauth过滤login_OAuth2AuthenticationProcessingFilter资源认证服务器过滤器
  4. Android 设置EditText光标Cursor颜色及粗细
  5. 理解Linux系统中的load average(图文版)转载
  6. 解决git@github.com: Permission denied (publickey). fatal: Could not read from remote repository. Pleas
  7. [JavaWeb-HTTP]HTTP概念
  8. php一行多个商品,【后端开发】php一行展示多个商品怎么实现
  9. tkinter label_tkinter做一个简易提词板
  10. 百度黑莓宣布联手搞自动驾驶,QNX系统成Apollo平台基础
  11. sed基本用法 sed文本块处理 、 sed高级应用
  12. 【转】iphone开发中NSMutableAttributedString/NSAttributedString 富文本设置
  13. eclipse 添加jar (servlet api)
  14. 转:Rust 调用C/C++
  15. base上海 Ai建筑设计 Python招聘ing
  16. 朗强:连接电脑的HDMI线输入电视上没有反应是什么原因?
  17. 如何开通微信商城?微商城的开通方法?
  18. 【数据结构】格洛克怎么上膛?栈的结构帮你解答!
  19. 【软考软件评测师】2015年下案例分析历年真题
  20. List的remove()方法避坑

热门文章

  1. Amlogic S905X3外设驱动之RTC驱动:HYM8563驱动
  2. amd显卡用黑苹果输出黑屏_黑苹果XFX讯景显卡刷vBIOS教程,使其黑苹果显卡更稳定完美,不再黑屏...
  3. 如何优化MySQL千万级大表,我写了6000字的解读
  4. 【CPRI协议v7.0】CPRI 8b/10b编码Scrambling功能
  5. 2021年高热度排行前十名进销存管理软件
  6. ydui时间组件报错nvalid prop: custom validator check failed for prop “startDate“.
  7. 机器学习必学十大算法
  8. 腾讯云域名购买和域名解析教程
  9. radon变换的原理-通过直线方程式的计算来检测出直线
  10. 简单英译汉SQL脚本