Есть ли способ найти ключ во всем файле JSON с помощью QJsonObject? - PullRequest
0 голосов
/ 14 мая 2019

Ключ на любом уровне иерархии json. Как я могу найти этот ключ, не зная точных ключей в пути?

1 Ответ

2 голосов
/ 14 мая 2019

Как правило, это можно решить с помощью рекурсивной функции (функции, которая вызывает себя). Сначала мы передаем ему объект документа, затем проверяем ключи объекта. Если ключи не найдены, мы применим ту же функцию к значениям каждой клавиши. Если массив передан, мы должны пройти через него.

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")
...