有没有一种方法可以使用QJsonObject在整个json文件中找到密钥?

时间:2019-05-14 04:00:42

标签: c++ qt qjsonobject

任何json层次结构中的键,如何在不知道路径中确切键的情况下找到该键?

1 个答案:

答案 0 :(得分:2)

通常,这可以通过递归函数(调用自身的函数)解决。我们首先将文档的对象传递给它,然后检查对象的键。如果找不到键,我们将对每个键的应用相同的功能。如果传递了数组,则应该对其进行迭代。

QJsonValue findKey(const QString& key, const QJsonValue& value) {
    if (value.isObject()) {
        const QJsonObject obj = value.toObject();
        if (obj.contains(key))
            return obj.value(key);           // return 'early' if object contains key    

        for (const auto& value : obj) {
            QJsonValue recurse = findKey(key, value);  // call itself, forwarding a value        
            if (!recurse.isNull())
                return recurse;              // value found, return 'early'
        }
    } else if (value.isArray()) {
        for (const auto& value : value.toArray()) {
            QJsonValue recurse = findKey(key, value);
            if (!recurse.isNull())
                return recurse;
        }
    }

    return QJsonValue();          // base case: a null value
}

int main(int argc, char *argv[])
{
    QFile file(":/res/scratch.json");   // json stored in a qrc with /res/ prefix
    file.open(QIODevice::ReadOnly);

    if (!file.isOpen()) {
        qDebug() << "error: couldn't open scratch.json";
        return 0;
    }

    QJsonDocument doc = QJsonDocument::fromJson(file.readAll());
    qDebug() << "value:" << findKey("treasure", doc.object());
}

JSON文件和相关输出的示例:

scratch.json:

{
    "deck": [
        "first mate",
        "sailor",
        "john muir"
    ],
    "cabin": [
        {
            "name": "lamp"
        },
        {
            "name": "treasure chest",
            "items": {
                "diamonds": 3,
                "silver": 5,
                "gold": 10,
                "safebox": {
                    "treasure": "shiny"
                }
            }
        }
    ]
}

输出:

value: QJsonValue(string, "shiny")