调用莫斯科时间API时变量获空int,QJsonValue为空问题求助
解决调用莫斯科时间API时QJsonValue为空、变量得到空int的问题
嘿,这种JSON解析踩坑的事儿我太熟了!咱们一步步来排查和解决:
可能的核心原因
- JSON字段路径导航错误:你大概率是没找准API返回JSON里莫斯科时间字段的正确层级,直接取了不存在的键,导致QJsonValue为空
- 字段类型不匹配:API返回的时间可能是字符串类型(比如"1700000000"),你直接用
toInt()就会得到0(空int值) - 网络请求未获取完整JSON:如果QNetworkReply没正确读取到完整的响应数据,解析出来的JSON本身就是不完整的,自然会出现空值
具体排查与修复步骤
1. 先确认API返回的完整JSON结构
不管你之前有没有看过,先把整个JSON打印出来,确保你知道字段的准确位置:
// 假设你已经获取到QJsonDocument对象jsonDoc qDebug() << "完整API返回JSON:" << jsonDoc.toJson(QJsonDocument::Indented);
比如假设API返回的JSON是这样的:
{
"status": "success",
"result": {
"moscow": {
"timestamp": 1700000000,
"datetime": "2023-11-15T12:00:00"
}
}
}
那你直接取jsonObj.value("timestamp")肯定是空的,得一层层往下找。
2. 安全地逐层解析JSON,添加空值判断
不要直接链式调用toObject()或toInt(),每一步都检查字段是否存在、值是否有效:
QJsonObject rootObj = jsonDoc.object(); // 第一步:检查是否有result字段 if (!rootObj.contains("result")) { qDebug() << "JSON中无result字段"; return; } QJsonObject resultObj = rootObj.value("result").toObject(); // 第二步:检查是否有moscow字段 if (!resultObj.contains("moscow")) { qDebug() << "JSON中无moscow字段"; return; } QJsonObject moscowObj = resultObj.value("moscow").toObject(); // 第三步:检查timestamp字段是否存在且为整数类型 QJsonValue timestampVal = moscowObj.value("timestamp"); if (!timestampVal.isInt()) { qDebug() << "timestamp字段不存在或不是整数类型"; // 如果是字符串类型的时间戳,试试这个: bool ok; int timestamp = timestampVal.toString().toInt(&ok); if (ok) { qDebug() << "转换字符串为int成功:" << timestamp; } else { qDebug() << "无法将该字段转为整数"; } return; } // 到这一步就能拿到正确的时间戳了 int moscowTimestamp = timestampVal.toInt(); qDebug() << "莫斯科时间戳:" << moscowTimestamp;
3. 检查网络请求是否完整
如果打印出来的JSON是空的或者不完整,那问题出在请求环节:
- 确保你在
QNetworkReply的finished()信号里读取数据,且用readAll()获取完整响应:
connect(reply, &QNetworkReply::finished, this, [=](){ if (reply->error() != QNetworkReply::NoError) { qDebug() << "请求错误:" << reply->errorString(); reply->deleteLater(); return; } QByteArray jsonData = reply->readAll(); QJsonParseError parseError; QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData, &parseError); if (parseError.error != QJsonParseError::NoError) { qDebug() << "JSON解析错误:" << parseError.errorString(); reply->deleteLater(); return; } // 这里开始解析jsonDoc reply->deleteLater(); });
额外小贴士
- 用
QJsonValue::isValid()也能快速判断值是否为空 - 如果API返回的是ISO格式的字符串时间,可以直接用
QDateTime::fromString()转换,不用纠结时间戳
内容的提问来源于stack exchange,提问作者Joe Doe
相关产品推荐
相关产品推荐

