Qt中如何将外部生成的std::string转换为QJsonArray?
解决思路与示例代码
首先明确:你提供的JSON根节点是对象,而非数组。saved_mik_yous字段是一个以UUID为键的对象集合,要得到QJsonArray,需要提取该对象下的所有值并组装成数组。
核心步骤
- 将
std::string转换为Qt的QByteArray,适配Qt JSON解析接口。 - 用
QJsonDocument解析JSON字符串,校验解析结果。 - 从根对象中取出
saved_mik_yous对应的子对象。 - 遍历子对象的所有值,逐个添加到
QJsonArray中。
示例代码
#include <QJsonDocument> #include <QJsonObject> #include <QJsonArray> #include <QByteArray> #include <string> #include <qDebug> QJsonArray convertToQJsonArray(const std::string& jsonStr) { // 1. 转换std::string为QByteArray QByteArray jsonBytes(jsonStr.c_str(), jsonStr.size()); // 2. 解析JSON文档并检查错误 QJsonParseError parseError; QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonBytes, &parseError); if (parseError.error != QJsonParseError::NoError) { qDebug() << "JSON解析失败:" << parseError.errorString(); return QJsonArray(); } // 3. 确认根节点是对象 if (!jsonDoc.isObject()) { qDebug() << "JSON根节点不是对象"; return QJsonArray(); } QJsonObject rootObj = jsonDoc.object(); // 4. 取出saved_mik_yous子对象 if (!rootObj.contains("saved_mik_yous")) { qDebug() << "JSON中不存在saved_mik_yous字段"; return QJsonArray(); } QJsonObject mikYousObj = rootObj.value("saved_mik_yous").toObject(); // 5. 提取所有值到QJsonArray QJsonArray resultArray; for (const QJsonValue& value : mikYousObj) { if (value.isObject()) { resultArray.append(value); } } return resultArray; } // 使用示例 int main() { std::string inputJson = R"({ "saved_mik_yous": { "2120ce2d-a5b1-49b8-8384-3781b7b2d73b": { "name": null, "id": "2120ce2d-a5b1-49b8-8384-3781b7b2d73b", "start": 1565288936.1127193, "end": 1565289128.1236603, "mixxer": 128.567505, "mik_source": "algo" }, "bf855c0d-a71d-42ea-b3ef-7cbe0e2c7a3d": { "name": null, "id": "bf855c0d-a71d-42ea-b3ef-7cbe0e2c7a3d", "start": 1565301673.4609745, "end": 1565301832.665656, "mixxer": 308.485107, "mik_source": "algo" } }, "mik_you_state": "completed" })"; QJsonArray mikYousArray = convertToQJsonArray(inputJson); // 验证转换结果 qDebug() << "转换后的数组大小:" << mikYousArray.size(); for (const QJsonValue& item : mikYousArray) { qDebug() << "条目ID:" << item.toObject().value("id").toString(); } return 0; }
注意事项
- 若外部生成的JSON存在格式问题(如多余逗号、引号不匹配),解析会失败,可通过
QJsonParseError输出的错误信息定位问题。 - 若
saved_mik_yous下的子节点并非全是对象,可根据业务需求添加额外的类型校验逻辑,避免非法数据混入数组。
内容的提问来源于stack exchange,提问作者user6020845
相关产品推荐
相关产品推荐

