You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在Qt中解析Web服务返回的未命名JSON数组问题

Qt读取Web服务JSON响应时引号被转义导致格式无效的解决办法

我太懂你这个困扰了——用Qt读取API返回的JSON数据,转成QString后用qDebug()输出,结果所有引号都被加了转义符,好好的JSON数组直接变“无效格式”,查了一堆示例都没解决对吧?

先给你拆解下问题根源:这其实是qDebug()的锅,不是你拿到的response本身有问题qDebug()为了让你能看到字符串的原始字节内容,会自动转义特殊字符(比如引号、反斜杠),但这只是输出时的显示效果,你的response变量里存的还是完全正常的JSON字符串。

下面给你几个实用的解决步骤:

  • 先验证原始字符串的正确性
    别光看控制台输出,把response写入文件看看真实内容:

    QFile outputFile("response.json");
    if (outputFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
        QTextStream out(&outputFile);
        out << response;
        outputFile.close();
    }
    

    打开生成的response.json文件,你会发现里面的JSON引号完全正常,没有任何转义。

  • 直接用Qt原生类解析JSON(重点)
    不用管控制台的转义显示,直接用QJsonDocument解析response就行,它能正确识别原始的JSON格式:

    QJsonParseError parseErr;
    QJsonDocument jsonDoc = QJsonDocument::fromJson(response.toUtf8(), &parseErr);
    
    if (parseErr.error != QJsonParseError::NoError) {
        qDebug() << "JSON解析失败:" << parseErr.errorString();
        return;
    }
    
    // 解析你的JSON数组
    if (jsonDoc.isArray()) {
        QJsonArray jsonArr = jsonDoc.array();
        for (const QJsonValue& item : jsonArr) {
            if (item.isObject()) {
                QJsonObject obj = item.toObject();
                qDebug() << "单词:" << obj["word"].toString() 
                         << "分数:" << obj["score"].toInt(-1); // 用-1作为无score字段的默认值
            }
        }
    }
    

    这段代码会完美解析你给出的JSON数组,完全不受qDebug()输出转义的影响。

  • 如果非要在控制台看无转义的JSON
    要是你只是想在控制台看到和原始JSON一致的输出,用qDebug().noquote()就行:

    qDebug().noquote() << "Return data: \n" << response;
    

    这样输出的字符串就不会被转义,和API返回的原始内容一模一样。

总结一下:别被qDebug()的转义输出误导了,你的response本身是没问题的,直接用Qt的JSON解析类处理就好,完全不需要手动去处理什么转义符。

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

火山引擎 最新活动