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

Qt C++使用QJsonDocument解析API嵌套JSON遇数组为空问题

问题分析与修正

你的核心错误是将JSON中类型为对象的data字段错误转换为QJsonArray:
从给出的JSON可以看到,data是用{}包裹的对象,而非[]包裹的数组,调用toArray()会返回空数组,直接触发了jsonArray.isEmpty()的判断。

修正后的代码

QStringList postals;
QByteArray jsonBytes = reply->readAll(); // 直接用QByteArray,无需多余编码转换
QJsonDocument jsonResponse = QJsonDocument::fromJson(jsonBytes);

if (!jsonResponse.isObject()) {
    qDebug() << "JSON格式错误,根节点不是对象";
    return "empty";
}

QJsonObject rootObj = jsonResponse.object();
// 正确将data转为QJsonObject
QJsonObject dataObj = rootObj["data"].toObject();
// 取出"postal codes"数组
QJsonArray postalCodesArr = dataObj["postal codes"].toArray();

foreach (const QJsonValue &postalItem, postalCodesArr) {
    QJsonObject postalObj = postalItem.toObject();
    // 从当前遍历的邮编对象中取value字段
    QString postalValue = postalObj["value"].toString();
    if (!postalValue.isEmpty()) {
        postals.append(postalValue);
    }
}

// 后续可根据需求返回postals或处理结果

额外注意事项

  • 原代码还有一处逻辑错误:遍历postal codes数组时,你误用了外层的obj(data对象)取value,应该用当前遍历的postalObj。
  • 直接用QByteArray接收响应数据,避免不必要的字符串编码转换,提升效率。
  • 增加JSON格式合法性判断(如jsonResponse.isObject()),可以避免非法JSON导致的后续解析崩溃。

内容的提问来源于stack exchange,提问作者blue8ird

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:15:27