Qt 6嵌套JSON对象解析失败求助:提取字段返回空值
问题分析与解决方案
核心问题:API返回结构理解错误
TV Maze的/search/shows接口返回的是JSON数组(多个搜索结果的集合),而不是单个JSON对象。你当前代码直接将整个JSON文档转为QJsonObject,自然找不到show字段——因为根结构是数组,不是包含show键的对象。
次要问题:内存泄漏
你用new QByteArray()创建了动态数组,但后续没有释放,会导致内存泄漏。直接使用栈上的QByteArray即可,无需动态分配。
潜在问题:未初始化的搜索关键词
构造函数里的show_in变量看起来没有赋值,这会导致请求URL的搜索关键词为空,API返回结果不符合预期,要确保这个变量传入了正确的搜索内容。
修正后的代码示例
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) , show_in("friends") // 示例:初始化搜索关键词,可根据实际场景修改 { ui->setupUi(this); QNetworkAccessManager *manager = new QNetworkAccessManager(this); QString url = "https://api.tvmaze.com/search/shows?q=" + show_in; QNetworkRequest request(url); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(managerFinished(QNetworkReply*))); manager->get(request); } void MainWindow::managerFinished(QNetworkReply *reply) { // 直接用栈上的QByteArray,避免内存泄漏 QByteArray jsonData = reply->readAll(); QJsonDocument myJson = QJsonDocument::fromJson(jsonData); // 根结构是数组,转为QJsonArray遍历 if (myJson.isArray()) { QJsonArray resultsArray = myJson.array(); for (const QJsonValue &item : resultsArray) { // 每个数组元素是包含"show"的对象 QJsonObject resultObj = item.toObject(); QJsonObject showObj = resultObj.value("show").toObject(); // 提取剧集名称 QString name = showObj.value("name").toString(); // 提取评分(注意rating是嵌套对象,里面的average字段) double rating = showObj.value("rating").toObject().value("average").toDouble(); // 提取海报图片地址(medium或original字段) QString posterUrl = showObj.value("image").toObject().value("medium").toString(); qDebug() << "剧集名称:" << name; qDebug() << "评分:" << rating; qDebug() << "海报地址:" << posterUrl; qDebug() << "------------------------"; } } else { qDebug() << "API返回格式错误,不是JSON数组"; } reply->deleteLater(); // 记得释放reply对象 } MainWindow::~MainWindow() { delete ui; }
关键修正点说明
- 把根JSON结构转为
QJsonArray,遍历每个搜索结果条目 - 每个条目是一个包含
show键的对象,先提取这个对象再获取内部字段 - 处理评分时,注意
rating是嵌套对象,需要取average字段 - 海报地址在
image对象下,有medium(中等尺寸)和original(原始尺寸)两个选项,可按需选择 - 修复了内存泄漏问题,同时添加
reply->deleteLater()确保网络回复对象被正确释放
内容的提问来源于stack exchange,提问作者YBIss
相关产品推荐
相关产品推荐

