QT读取数组中的json键值对

时间:2018-11-17 10:52:31

标签: json qt

以下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 个答案:

答案 0 :(得分:0)

基本上,您可以遍历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"

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

以下代码显示第二个成员的“名称”值:

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

输出:

"TPS Timer"

希望这会有所帮助。