在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




