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
相关产品推荐
相关产品推荐

