首页 > 解决方案 > Qt JSON:如何获取数组元素?

问题描述

我觉得我在这里失去了理智。

我正在尝试解析 JSON 文档,每次尝试访问数组的元素时,我都会得到数组本身。经过一番淘汰后,我想出了以下SSCCE:

#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    const QByteArray jsonData {"[1,2]"};

    QJsonParseError error;
    const QJsonDocument jsonDoc {QJsonDocument::fromJson(jsonData, &error)};
    if(error.error != QJsonParseError::NoError)
    {
        qWarning() << error.errorString();
        return -1;
    }
    Q_ASSERT(!jsonDoc.isNull());
    Q_ASSERT(!jsonDoc.isEmpty());

    Q_ASSERT(jsonDoc.isArray());
    const QJsonArray jsonArray {jsonDoc.array()};
    qDebug() << jsonArray.size(); // Expectation: 2, reality: 1
    qDebug() << jsonArray; // Expectation: QJsonArray([1,2]), reality: QJsonArray([[1,2]])

    const QJsonValue jsonValue {jsonArray.at(0)};
    qDebug() << jsonValue.type(); // returns 4 (Array)

    const QJsonArray jsonArray2 {jsonValue.toArray()};
    qDebug() << jsonArray2.size(); // Expectation: 2, reality: 1
    qDebug() << jsonArray2; // Expectation: QJsonArray([1,2]), reality: QJsonArray([[1,2]])

    // ...ad infinitum

    return 0;
}

问题是,我在 Qt 5.9.4 和 5.15.1 上得到了这种行为,但在古代 Qt 5.1.1 上却没有!

在 Qt 5.1.1 上,结果正是我所期望的:jsonArray.size()返回 2、jsonArrayisQJsonArray([1,2])jsonValue.type()is 2 ( Double)。

显然问题出在我身上,因为像这样的错误不会溜走并存活(至少)三年。所以问题是,我如何使用现代 Qt 版本从上述示例中的数组中提取实际值(即1和)。2

标签: arraysjsonqt

解决方案


const QJsonArray jsonArray {jsonDoc.array()}; 这不符合您的预期。花括号初始化在用于所有不需要它的地方(除了不可读性)时,真的是一个皮塔饼。


推荐阅读