代码之家  ›  专栏  ›  技术社区  ›  Basti An

QT读取数组中的json键值对

  •  0
  • Basti An  · 技术社区  · 7 年前

    以下JSON应该在qt中读取,并作为键值对存储在数组中,这样我就可以处理这些值:

    json:

        {
       "datasources":[
       {"id":1,"name":"TPS Position"},
       {"id":2,"name":"TPS Timer"},
       {"id":3,"name":"Lateral G"},
       {"id":4,"name":"Longitudal G"},
       {"id":5,"name":"Z"},
       {"id":6,"name":"AFR"}
    ]}
    

    我阅读了QT JSON savegame示例,但我不知道如何读取键值。 这是我的qt代码,但我不知道如何继续:

        jsonFileValue = datasourcesjson.readAll();
        datasourcesjson.close();
    
        QJsonDocument m_DataSourceDocument = QJsonDocument::fromJson(jsonFileValue.toUtf8());
    
        QJsonObject m_DataSourceObject = m_DataSourceDocument.object();
    
        QJsonArray m_DataSourceArray = m_DataSourceObject.value(QString("datasources")).toArray();
        qWarning() << m_DataSourceArray;
    

    这是输出:

    QJsonArray([{"id":1,"name":"TPS Position"},{"id":2,"name":"TPS Timer"},{"id":3,"name":"Lateral G"},{"id":4,"name":"Longitudal G"},{"id":5,"name":"Z"},{"id":6,"name":"AFR"}])
    

    但是我如何才能在数组中获取这些数据,以便在我的程序(如QMap)中处理键值?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Rob    7 年前

    基本上,您可以循环使用QJsonArray,并从每个成员获取QJsonObject。然后可以通过其键获取值。QJsonObject::value()返回QJsonValue类型的对象,该对象可以在您的案例中转换为QString或int。

        QJsonDocument m_DataSourceDocument = QJsonDocument::fromJson(jsonFileValue.toUtf8());
    
        QJsonObject m_DataSourceObject = m_DataSourceDocument.object();
    
        QJsonArray m_DataSourceArray = m_DataSourceObject.value(QString("datasources")).toArray();
        qWarning() << m_DataSourceArray;
    
        for (const auto m_DataSource : m_DataSourceArray)
        // or instead of c++11 for-loop, you can use foreach, like:
        // foreach (const QJsonValue& m_DataSource, m_DataSourceArray)
        {
            QJsonObject m_DataSourceObject = m_DataSource.toObject();
            qWarning() << "Id: "
                     << m_DataSourceObject.value("id").toInt()
                     << " and name: "
                     << m_DataSourceObject.value("name").toString();
        }
    

    产出:

    Id:  1  and name:  "TPS Position"
    Id:  2  and name:  "TPS Timer"
    Id:  3  and name:  "Lateral G"
    Id:  4  and name:  "Longitudal G"
    Id:  5  and name:  "Z"
    Id:  6  and name:  "AFR"
    

    如果不想遍历所有成员,还可以从数组中读取单个值。

    以下代码打印第二个成员的“name”值:

        qWarning() << m_DataSourceArray.at(1).toObject().value("name").toString();
    

    产出:

    "TPS Timer"
    

    希望这有帮助。