当前位置:网站首页>使用QT遍历Json文档及搜索子对象
使用QT遍历Json文档及搜索子对象
2022-07-05 17:33:00 【黑脚印_DarkSpoor】
关于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() << "空文档";
}
}
//遍历QJsonObject
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()) //遍历所有的key
{
QJsonValue jvalue = obj[key];
PrintJsonValue(jvalue,key,retract+1); //打印输出QJsonValue
}
}
//遍历QJsonArray
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); //打印输出QJsonValue
}
}
//打印输出QJsonValue
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() ";
}
}
//测试代码
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() ";
}
}
};边栏推荐
- Sentinel flow guard
- 十个顶级自动化和编排工具
- Check the WiFi password connected to your computer
- 毫无章法系列
- 排错-关于clion not found visual studio 的问题
- Cartoon: looking for the k-th element of an unordered array (Revised)
- Anaconda中配置PyTorch环境——win10系统(小白包会)
- Which platform of outer disk gold is regular and safe, and how to distinguish it?
- Teamcenter 消息注册前操作或后操作
- 一口气读懂 IT发展史
猜你喜欢

网络威胁分析师应该具备的十种能力

To solve the problem of "double click PDF file, pop up", please install Evernote program

EPM related

提高應用程序性能的7個DevOps實踐

ICML 2022 | Meta提出魯棒的多目標貝葉斯優化方法,有效應對輸入噪聲

PMP认证需具备哪些条件啊?费用多少啊?

ICML 2022 | meta proposes a robust multi-objective Bayesian optimization method to effectively deal with input noise

mybash

统计php程序运行时间及设置PHP最长运行时间

Cmake tutorial Step2 (add Library)
随机推荐
漫画:有趣的【海盗】问题
漏洞复现----48、Airflow dag中的命令注入(CVE-2020-11978)
证券网上开户安全吗?证券融资利率一般是多少?
漫画:如何实现大整数相乘?(整合版)
Cmake tutorial Step4 (installation and testing)
普通程序员看代码,顶级程序员看趋势
一文读懂简单查询代价估算
tkinter窗口预加载
Cmake tutorial step6 (add custom commands and generate files)
Please tell me why some tables can find data by writing SQL, but they can't be found in the data map, and the table structure can't be found
c#图文混合,以二进制方式写入数据库
Cartoon: looking for the best time to buy and sell stocks
Mongodb (quick start) (I)
云主机oracle异常恢复----惜分飞
CVPR 2022 best student paper: single image estimation object pose estimation in 3D space
mybash
This 17-year-old hacker genius cracked the first generation iPhone!
Simple query cost estimation
读libco保存恢复现场汇编代码
LeetCode 练习——206. 反转链表