QT 读取 JSON 文件并存储和检索值

Posted

技术标签:

【中文标题】QT 读取 JSON 文件并存储和检索值【英文标题】:QT Reading a JSON file and storing and retriving values 【发布时间】:2016-08-04 06:34:21 【问题描述】:

我正在尝试在 QT 中读取如下所示的 json 文件。有人可以建议一种从 json 对象获取值并将它们存储在单独的容器或数组中的方法,例如 test_cell2.CELLS[0] 或某种方式,以便也可以处理嵌套,并且我可以在解析文件后轻松访问它们

"test_cells2" : 
        "CELLS" : 
            "cell_0" : 
                "prettyName" : "cell_1",
                "CELLS" : 
                    "cell_1" : 
                        "prettyName" : "cell_1",
                        "type" : "default",
                    ,
                ,
            ,
            "cell_1" : 
                "prettyName" : "cell_1",
                "type" : "default",
            ,
            "cell_2" : 
                "type" : "text cell ko",
            ,
            "cell_3" : 
                "prettyName" : "cell_3",
                "type" : "default",
            ,
            "cell_4" : 
                "data" : 
                    "settings" : 
                        "EXEC_PARAMETERS" : 
                            "defaultQueue" : "batch",
                            "environment" : 
                                "blabla" : "blabla2",
                            ,
                        ,
                    ,
                ,
                "type" : "parallel_test",
             ,
        ,
    ,

【问题讨论】:

How to create/read/write JSon files in Qt5的可能重复 【参考方案1】:

看看这个函数

QJsonDocument::fromJson(QByteArray)

http://doc.qt.io/qt-5/qjsondocument.html#fromJson

然后使用QJsonDocument::object(),你可以使用键来获取你的值:

QJsonDocument doc = QJsonDocument::fromJson(QByteArray);
QJsonObject root = doc.object();
foreach(QJsonValue element, root["CELLS"].toArray())
    QJsonObject node = element.toObject();
    node["whatEver"];


【讨论】:

【参考方案2】:

如果您的 Qt 版本 > 5.5,请检查 QJSonDocument,http://doc.qt.io/qt-5/qjsondocument.html。

一个例子:

    // Just read it from a file... or copy here        
    const QString yourJSON = "...";
    const QJsonDocument jsonDoc = QJsonDocument::fromJson(yourJSON.toLocal8Bit());
    const QVariantMap map = jsonDoc.toVariant().toMap();

要注意 CELLS 在 CELLS 中的嵌套,首先加载您的 CELLS 数组:

    // Start read your parameter
    const QVariant testCells2 = map["test_cells2"].toVariant();
    const QVariantList CELLS = testCells2.toList();
    // Now, we have a list available CELLS, check one be one
    foreach (const QVariant& cell, CELLS) 
        const QVariantMap wrapped = cell.toMap();
        qDebug() << "Pretty Name: " << wrapped["prettyName"].toString();
        qDebug() << "Type: " << wrapped["type"].toString();
        const hasList = !wrapped["CELLS"].toList().isEmpty();
        qDebug() << "Has child list? <<  hasList;
        if (hasList) 
             // Start another loop to check the child list.
        
    

【讨论】:

如何照顾 CELLS 在 CELLS 中的嵌套 我添加了一些更改以使用 QVariant、QVariantList、QVariantMap,您也可以使用 QJsonObject。

以上是关于QT 读取 JSON 文件并存储和检索值的主要内容,如果未能解决你的问题,请参考以下文章

XML 解析 - 读取一个简单的 XML 文件并检索值

Qt 和 JSON 资源解析 - 空 QJSONDocument

qt读取文件内容全部为浮点数的二进制文件

使用 PowerShell 脚本从 Azure Blob 存储读取 JSON 文件并写回 Blob 存储中的另一个文件

c_cpp qt读取json文件

扫描条形码并在将其存储在recyclerView中后从JSON中读取它