You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:42:50