QJsonObject能否嵌套查找?

一 概述

QJsonObject 支持嵌套查找,但需要逐层访问,因为 Qt 的 JSON API 是强类型的,没有内置的路径查询语法(如 JavaScript 的 obj.a.b.c)。

二 基本嵌套查找方法

假设有以下 JSON 数据:
{
"user": {
"profile": {
"name": "张三",
"address": {
"city": "北京",
"street": "长安街"
}
},
"settings": {
"theme": "dark"
}
}
}

1 逐层访问(推荐)


#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>

QJsonObject obj = ...; // 从文件或字符串解析得到的JSON对象

// 安全地逐层访问
if (obj.contains("user")) {
QJsonObject userObj = obj["user"].toObject();
if (userObj.contains("profile")) {
QJsonObject profileObj = userObj["profile"].toObject();
if (profileObj.contains("name")) {
QString name = profileObj["name"].toString();
qDebug() << "用户名:" << name;
}
}
}

2 链式访问(需注意空值检查)


// 简化写法,但可能不安全
QString name = obj["user"].toObject()["profile"].toObject()["name"].toString();
// 如果中间任何一级不存在,会返回空字符串或默认值

三 安全的嵌套查找辅助函数

由于 Qt 没有内置路径查找,可以自己实现一个辅助函数。

1 使用点分隔路径


/**
* 通过点分隔路径查找嵌套值(仅支持字符串键)
* @param obj 根对象
* @param path 路径,如 "user.profile.name"
* @return 找到的值,找不到返回 QJsonValue::Undefined
*/
QJsonValue findValueByPath(const QJsonObject& obj, const QString& path) {
QStringList keys = path.split('.');
QJsonValue current = obj;

for (const QString& key : keys) {
if (current.isObject()) {
current = current.toObject().value(key);
} else if (current.isArray()) {
bool ok;
int index = key.toInt(&ok);
if (ok && index >= 0 && index < current.toArray().size()) {
current = current.toArray().at(index);
} else {
return QJsonValue::Undefined;
}
} else {
return QJsonValue::Undefined;
}

if (current.isUndefined()) {
return QJsonValue::Undefined;
}
}

return current;
}

// 使用示例
QJsonValue value = findValueByPath(obj, "user.profile.name");
if (!value.isUndefined()) {
qDebug() << "找到值:" << value.toString();
}

2 支持数组索引的路径


// 查找 "users.0.profile.email" 这样的路径
QJsonValue findNestedValue(const QJsonObject& root, const QString& path) {
QStringList parts = path.split('.');
QJsonValue current = root;

for (const QString& part : parts) {
if (current.isObject()) {
QJsonObject obj = current.toObject();
if (obj.contains(part)) {
current = obj[part];
} else {
return QJsonValue::Undefined;
}
} else if (current.isArray()) {
QJsonArray arr = current.toArray();
bool ok;
int index = part.toInt(&ok);
if (ok && index >= 0 && index < arr.size()) {
current = arr.at(index);
} else {
return QJsonValue::Undefined;
}
} else {
return QJsonValue::Undefined;
}
}

return current;
}

四 QJsonObject 查找方法对比


1 逐层访问

类型安全代码清晰 代码冗长,需要多次检查。


2 链式访问

代码简洁 不安全,中间缺失会静默失败。


3 辅助函数

可重用,支持路径语法 需要额外实现,性能略差。

五 实际应用示例


// 解析复杂的JSON配置
QJsonObject config = loadConfig();

// 使用辅助函数查找嵌套值
QJsonValue timeout = findNestedValue(config, "network.connection.timeout");
if (!timeout.isUndefined() && timeout.isDouble()) {
int timeoutMs = timeout.toInt();
// 使用超时设置
}

// 查找数组中的嵌套对象
QJsonValue user = findNestedValue(config, "users.0");
if (user.isObject()) {
QJsonObject userObj = user.toObject();
QString name = userObj["name"].toString();
}

// 设置嵌套值(需要特殊处理)
bool setNestedValue(QJsonObject& root, const QString& path, const QJsonValue& value) {
QStringList parts = path.split('.');
QJsonObject* current = &root;

// 遍历到倒数第二层
for (int i = 0; i < parts.size() - 1; ++i) {
QString key = parts[i];
if (!current->contains(key) || !(*current)[key].isObject()) {
(*current)[key] = QJsonObject(); // 自动创建中间对象
}
current = const_cast<QJsonObject*>(&(*current)[key].toObject());
}

// 设置最后一层
(*current)[parts.last()] = value;
return true;
}

六 注意事项

1. 类型检查至关重要

// 错误的做法
QString name = obj["user"].toObject()["name"].toString(); // 可能崩溃

// 正确的做法
if (obj["user"].isObject()) {
QJsonObject user = obj["user"].toObject();
if (user["name"].isString()) {
QString name = user["name"].toString();
}
}

2 性能考虑
嵌套越深,查找成本越高。
频繁查找建议缓存中间结果。
大数据量时考虑使用 QJsonDocument 的二进制格式。


3 QML 中的嵌套查找
在 QML 中可以直接使用点语法:

// QML中可以直接使用
var city = jsonObject.user.profile.address.city;

七 总结

QJsonObject 确实支持嵌套查找,但:

1 没有内置的路径查询语法,需要逐层访问或自己实现辅助函数。
2 类型安全很重要,必须检查每一级的类型。
3 推荐使用逐层访问确保代码健壮性,或封装可重用的路径查找函数。
4 对于复杂的 JSON 操作,可以考虑使用第三方库(如 JsonCpp、nlohmann/json)或 Qt 6 中增强的 JSON 支持。

Qt 5 的 JSON API 设计偏保守,强调类型安全而非便利性,这是其与 JavaScript 等动态语言处理 JSON 的主要区别。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1134274.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实战教程:3种方法彻底删除Windows设备和驱动器图标

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个分步骤的图文教程应用&#xff0c;展示三种不同的方法来删除Windows系统中的设备和驱动器图标。包括使用注册表编辑器修改特定键值、通过磁盘管理隐藏驱动器、以及使用第三…

自学网络安全?一般人我还是劝你算了吧_java和网络安全难易程度

前言 本人纯屌丝一枚&#xff0c;在学网络安全之前对电脑的认知也就只限于上个网&#xff0c;玩个办公软件。这里不能跑题&#xff0c;我为啥说自学网络安全&#xff0c;一般人我还是劝你算了吧。因为我就是那个一般人。 基础真的很简单&#xff0c;是个人稍微认点真都能懂&a…

30分钟构建ComfyUI备份清理工具原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 使用快速开发框架构建一个最小可行产品(MVP)&#xff0c;能够&#xff1a;1)扫描指定目录检测LEGACY备份&#xff1b;2)显示备份详细信息&#xff1b;3)执行删除操作。要求界面简洁…

流放之路2物品过滤器配置实战手册:打造专属拾取系统

流放之路2物品过滤器配置实战手册&#xff1a;打造专属拾取系统 【免费下载链接】NeverSink-Filter-for-PoE2 This is a lootfilter for the game "Path of Exile 2". It adds colors, sounds, map icons, beams to highlight remarkable gear and inform the user …

收藏!2025大模型时代,AI产品经理转型全攻略(小白程序员必看)

前言&#xff1a;大模型浪潮下&#xff0c;AI产品经理为何必须主动转型&#xff1f; 2025年&#xff0c;全球AI大模型市场规模正式突破5000亿美元大关&#xff0c;国内核心大模型企业数量已超300家&#xff0c;行业人才缺口持续扩大——其中大模型产品经理岗位缺口高达50万&…

1小时验证创意:用AI智能体快速原型你的商业想法

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 快速开发一个健身教练AI代理原型&#xff0c;核心功能&#xff1a;1)根据用户身体数据生成训练计划 2)动作指导视频推荐 3)进度跟踪 4)营养建议。只需实现MVP版本&#xff0c;前端…

基于CRNN OCR的身份证信息自动提取系统搭建指南

基于CRNN OCR的身份证信息自动提取系统搭建指南 &#x1f4d6; 技术背景与项目定位 在数字化办公、身份核验、金融风控等场景中&#xff0c;身份证信息的自动化提取已成为提升效率的关键环节。传统人工录入方式不仅耗时耗力&#xff0c;还容易出错。而通用OCR&#xff08;光学字…

30分钟搭建:MEMTEST86云端测试平台原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个MEMTEST86云端测试平台原型&#xff0c;功能包括&#xff1a;1. 基于Web的测试任务下发 2. 客户端自动下载测试镜像 3. 实时测试进度监控 4. 云端结果存储与分析 5. 多设备…

Remote Desktop Manager(远程桌面工具)

Remote Desktop Manager是一款功能强大的远程桌面管理软件&#xff0c;可以帮助管理员高效管理和连接多个远程桌面。无论是服务器运维、技术支持还是远程办公&#xff0c;都能通过统一界面简化操作、降低管理成本。 软件功能 支持多种远程连接类型&#xff0c;包括RDP、VNC、S…

GodMode9实战手册:3DS文件管理的终极武器

GodMode9实战手册&#xff1a;3DS文件管理的终极武器 【免费下载链接】GodMode9 GodMode9 Explorer - A full access file browser for the Nintendo 3DS console :godmode: 项目地址: https://gitcode.com/gh_mirrors/go/GodMode9 GodMode9是任天堂3DS游戏机上功能最全…

零基础学写主力指标:从入门到精通的公式源码

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个交互式学习工具&#xff0c;分步引导新手完成主力指标公式编写&#xff1a;1)解释基本概念 2)演示简单公式 3)提供可修改的模板代码 4)实时预览修改效果。从最基础的成交量…

从零开始:用Llama Factory构建你的第一个AI写作助手

从零开始&#xff1a;用Llama Factory构建你的第一个AI写作助手 作为一名内容创作者&#xff0c;你是否经常遇到灵感枯竭、写作卡壳的困境&#xff1f;想要一个能帮你生成创意文本的AI助手&#xff0c;却又被复杂的机器学习知识劝退&#xff1f;别担心&#xff0c;今天我将带你…

5分钟掌握Whitebox Tools:从地形分析到水文建模的完整实战指南

5分钟掌握Whitebox Tools&#xff1a;从地形分析到水文建模的完整实战指南 【免费下载链接】whitebox-tools An advanced geospatial data analysis platform 项目地址: https://gitcode.com/gh_mirrors/wh/whitebox-tools Whitebox Tools是一个功能强大的地理空间数据分…

AMD显卡在macOS中卡顿黑屏?5个优化技巧让性能飞起来!

AMD显卡在macOS中卡顿黑屏&#xff1f;5个优化技巧让性能飞起来&#xff01; 【免费下载链接】WhateverGreen Various patches necessary for certain ATI/AMD/Intel/Nvidia GPUs 项目地址: https://gitcode.com/gh_mirrors/wh/WhateverGreen 还在为AMD显卡在macOS中的兼…

Instant Meshes终极指南:从零开始掌握场对齐网格生成技术

Instant Meshes终极指南&#xff1a;从零开始掌握场对齐网格生成技术 【免费下载链接】instant-meshes Interactive field-aligned mesh generator 项目地址: https://gitcode.com/gh_mirrors/in/instant-meshes Instant Meshes是一款革命性的交互式场对齐网格生成器&am…

2025终极指南:3款快速提升音乐创作体验的免费工具

2025终极指南&#xff1a;3款快速提升音乐创作体验的免费工具 【免费下载链接】cli Command-line tool to customize Spotify client. Supports Windows, MacOS, and Linux. 项目地址: https://gitcode.com/gh_mirrors/cli3/cli 你是否曾经遇到过这些问题&#xff1a;录…

OCR系统日志分析:CRNN服务的运行状态监控

OCR系统日志分析&#xff1a;CRNN服务的运行状态监控 &#x1f4d6; 项目简介 在现代信息处理场景中&#xff0c;OCR&#xff08;光学字符识别&#xff09;技术已成为自动化文档处理、票据识别、智能录入等业务流程的核心支撑。尤其在金融、政务、物流等行业&#xff0c;OCR能够…

Cherry Studio:一站式AI桌面客户端完整使用指南

Cherry Studio&#xff1a;一站式AI桌面客户端完整使用指南 【免费下载链接】cherry-studio &#x1f352; Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端 项目地址: https://gitcode.com/CherryHQ/cherry-studio 还在为多个AI模型切换而烦恼吗&#xff1f;Cher…

Toggl Desktop 桌面时间管理终极指南

Toggl Desktop 桌面时间管理终极指南 【免费下载链接】toggldesktop Toggl Desktop app for Windows, Mac and Linux 项目地址: https://gitcode.com/gh_mirrors/to/toggldesktop 你是否经常忘记记录工作时间&#xff1f;是否在项目结算时才发现时间数据不全&#xff1f…

7天精通HyperLPR3:从零搭建高精度车牌识别系统

7天精通HyperLPR3&#xff1a;从零搭建高精度车牌识别系统 【免费下载链接】HyperLPR 基于深度学习高性能中文车牌识别 High Performance Chinese License Plate Recognition Framework. 项目地址: https://gitcode.com/gh_mirrors/hy/HyperLPR 还在为车牌识别系统开发而…