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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 03:54:27