有没有办法使用 QJsonObject 在整个 json 文件中找到一个键?

Posted

技术标签:

【中文标题】有没有办法使用 QJsonObject 在整个 json 文件中找到一个键?【英文标题】:Is there a way find a key in the whole json file using QJsonObject? 【发布时间】:2019-05-14 04:00:42 【问题描述】:

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

【问题讨论】:

【参考方案1】:

通常,这可以通过递归函数(一个调用自身的函数)来解决。我们首先将文档的对象传递给它,然后检查对象的键。如果没有找到键,我们将对每个键的 values 应用相同的函数。如果传递了一个数组,我们应该遍历它。

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

【讨论】:

以上是关于有没有办法使用 QJsonObject 在整个 json 文件中找到一个键?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt 中使用 QWebChannel 发送 QJsonObject

错误:C2039:“指针”:不是“QJsonObject::iterator”的成员

Qt使用QJsonDocument、QJsonObject、QJsonArray解析JSON

将 QJsonObject 转换为 Javascript 对象

QtQt中QJsonObject类

如何修改 QJsonObject