Qt讀寫Json


Qt操作Json

1、QJsonDocument

1、詳細說明

QJsonDocument類提供了讀寫JSON文檔的方法。
QJsonDocument是一個封裝了完整JSON文檔的類,可以從基於UTF-8編碼的文本或者Qt的二進制格式讀寫此文檔。
可以使用QJsonDocument :: fromJson()將JSON文檔從其基於文本的表示轉換為QJsonDocument。 toJson()將其轉換回文本。 解析器非常快速有效,並將JSON轉換為Qt使用的二進制表示。
可以使用!isNull()查詢已解析文檔的有效性
可以使用isArray()和isObject()查詢文檔是否包含數組或對象。 可以使用array()或object()檢索文檔中包含的數組或對象,然后進行讀取或操作。
還可以使用fromBinaryData()或fromRawData()從存儲的二進制表示創建文檔。

2、QJsonArray

1、詳細說明

QJsonArray 類封裝了一個 JSON 數組。

JSON 數組是值的列表。列表可以被操作,通過從數組中插入和刪除 QJsonValue 。

一個 QJsonArray 可以和一個 QVariantList 相互轉換。可以使用 size() 來查詢條目的數量,通過 insert() 在指定索引處插入值,removeAt() 來刪除指定索引的值。支持標准C++的迭代器。

QJsonArray是一個隱式共享類,只要它沒有被修改,就會與創建它的文檔共享數據。
QJsonArray對象和基於文本的JSON可以通過QJsonDocument進行相互轉換。

3、QJsonObject

1、詳細說明

QJsonObject 類封裝了一個 JSON 對象。

一個 JSON 對象是一個“key/value 對”列表,key 是獨一無二的字符串,value 由一個 QJsonValue 表示。

一個 QJsonObject 可以和一個 QVariantMap 相互轉換。可以使用 size() 來查詢“key/value 對”的數量,通過 insert() 插入“key/value 對”, remove() 刪除指定的 key。

QJsonObject是一個隱式共享類,只要它沒有被修改,就會與創建它的文檔共享數據。
QJsonObject對象和基於文本的JSON可以通過QJsonDocument進行相互轉換。

4、QJsonParseError

1、詳細說明

QJsonParseError 類用於在 JSON 解析中報告錯誤。

5、QJsonValue

1、詳細說明

QJsonValue 類封裝了一個值。

JSON 中的值有 6 種基本數據類型:

  • bool(QJsonValue::Bool)
  • double(QJsonValue::Double)
  • string(QJsonValue::String)
  • array(QJsonValue::Array)
  • object(QJsonValue::Object)
  • null(QJsonValue::Null)

一個值可以由任何上述數據類型表示。此外,QJsonValue 有一個特殊的標記來表示未定義的值,可以使用 isUndefined() 查詢。

值的類型可以通過 type() 或 isBool()、isString() 等訪問函數查詢。同樣地,值可以通過 toBool()、toString() 等函數轉化成相應的存儲類型。

與QVariant相反,不會嘗試進行任何隱式類型轉換。 這意味着轉換為未存儲在值中的類型將返回默認的構造返回值。

6、實例

生產一下Json文檔:

{
    "heartData": [
        {
            "I1": {
                "quality": 18.2,
                "temp": 25
            }
        },
        {
            "I2": {
                "quality": 2000,
                "temp": 20
            }
        },
        {
            "RO Rejection": {
                "value": 98
            }
        },
        {
            "TOC": {
                "value": 3
            }
        }
    ]
}

生產代碼:

void DJson::clearJsonObject(QJsonObject &object)
{
    QStringList strList = object.keys();

    for(int i = 0; i < strList.size(); ++i)
    {
        object.remove(strList.at(i));
    }

}

void DJson::createJsonFile(const QString &fileName)
{
    QJsonArray jsonArray;
    QJsonObject rootObject;
    QJsonObject branchObject;
    QJsonObject leafObject;

    leafObject.insert("quality", 18.2);
    leafObject.insert("temp", 25.0);
    branchObject.insert("I1", leafObject);
    jsonArray.append(branchObject);
    clearJsonObject(leafObject);
    clearJsonObject(branchObject);

    leafObject.insert("quality", 2000);
    leafObject.insert("temp", 20.0);
    branchObject.insert("I2", leafObject);
    jsonArray.append(branchObject);
    clearJsonObject(leafObject);
    clearJsonObject(branchObject);

    leafObject.insert("value", 98);
    branchObject.insert("RO Rejection", leafObject);
    jsonArray.append(branchObject);
    clearJsonObject(leafObject);
    clearJsonObject(branchObject);

    leafObject.insert("value", 3);
    branchObject.insert("TOC", leafObject);
    jsonArray.append(branchObject);
    clearJsonObject(leafObject);
    clearJsonObject(branchObject);

    rootObject.insert("heartData", jsonArray);

    QJsonDocument jsonDocument;
    jsonDocument.setObject(rootObject);

    QByteArray byteArray = jsonDocument.toJson(QJsonDocument::Indented);

    QFile file(fileName);
    if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        qDebug() << QString("fail to open the file: %1, %2, %3").arg(__FILE__).arg(__LINE__).arg(__FUNCTION__);
        return;
    }
    QTextStream out(&file);
    out << byteArray;

    file.close();

    qDebug() << byteArray;
}

解析:

void DJson::initList()
{
    m_iList << "I1" << "I2" << "I3" << "I4" << "I5";
    m_vList << "RO Rejection" << "TOC";
}

void DJson::parseJsonFile(const QString &fileName)
{
    QFile file(fileName);
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        qDebug() << QString("fail to open the file: %1, %2, %3").arg(__FILE__).arg(__LINE__).arg(__FUNCTION__);
        return;
    }
    QByteArray array = file.readAll();
    QJsonParseError jsonParseError;
    QJsonDocument jsonDocument(QJsonDocument::fromJson(array, &jsonParseError));
    if(QJsonParseError::NoError != jsonParseError.error)
    {
        qDebug() << QString("JsonParseError: %1").arg(jsonParseError.errorString());
        return;
    }
    QJsonObject rootObject = jsonDocument.object();

    if(!rootObject.keys().contains("heartData"))
    {
        qDebug() << "No target value";
        return;
    }
    qDebug() << rootObject.keys();

    QJsonValue jsonValue = rootObject.value("heartData");
    if(!jsonValue.isArray())
    {
        qDebug() << "No target array";
    }
    QJsonArray jsonArray = jsonValue.toArray();

    for(auto iter = jsonArray.constBegin(); iter != jsonArray.constEnd(); ++iter)
    {
        parseJsonObject(iter);
    }
    qDebug() << rootObject.keys();
}

void DJson::parseJsonObject(QJsonArray::const_iterator iter)
{
    QJsonObject jsonObject = (*iter).toObject();
    for(int i = 0; i < m_iList.size(); ++i)
    {
        if(jsonObject.keys().contains(m_iList.at(i)))
        {
            parseJsonObjectI(jsonObject);
            return;
        }
    }

    for(int i = 0; i < m_vList.size(); ++i)
    {
        if(jsonObject.keys().contains(m_vList.at(i)))
        {
            parseJsonObjectV(jsonObject);
            return;
        }
    }


}

void DJson::parseJsonObjectI(QJsonObject &object)
{
    qDebug() << object.keys();
    for(int i = 0; i < object.keys().size(); ++i)
    {
        QJsonValue jsonValue = object.value(object.keys().at(i));
        if(jsonValue.isObject())
        {
            QJsonObject jsonObject = jsonValue.toObject();

            if(jsonObject.keys().contains("quality"))
            {
                qDebug() << QString("%1 : %2").arg("quality").arg(jsonObject.value("quality").toDouble());
            }
            if(jsonObject.keys().contains("temp"))
            {
                qDebug() << QString("%1 : %2").arg("temp").arg(jsonObject.value("temp").toDouble());
            }
        }
    }
    qDebug() << object.keys();
}

void DJson::parseJsonObjectV(QJsonObject &object)
{
    qDebug() << object.keys();
    for(int i = 0; i < object.keys().size(); ++i)
    {
        QJsonValue jsonValue = object.value(object.keys().at(i));
        if(jsonValue.isObject())
        {
            QJsonObject jsonObject = jsonValue.toObject();
            if(jsonObject.keys().contains("value"))
            {
                qDebug() << QString("%1 : %2").arg("value").arg(jsonObject.value("value").toInt());
            }
        }
    }
    qDebug() << object.keys();
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM