參考自:https://www.cnblogs.com/chengjundu/p/11229896.html,感謝!
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 } } ] }
頭文件:
#ifndef PARSECLASS_H #define PARSECLASS_H #include <QObject> #include <QJsonDocument> #include <QJsonParseError> #include <QJsonArray> #include <QJsonObject> #include <QFile> #include <QIODevice> #include <QStringList> #include <QDebug> #include <QList> class ParseClass : public QObject { Q_OBJECT public: explicit ParseClass(QObject *parent = nullptr); void clearJsonObject(QJsonObject &object); void createJsonFile(const QString &fileName); void parseJsonObjectV(QJsonObject &object); void parseJsonObjectI(QJsonObject &object); void parseJsonObject(QJsonArray::const_iterator iter); void parseJsonFile(const QString &fileName); void initList(); private: signals: public slots: }; #endif // PARSECLASS_H
源文件:
#include "parseclass.h" ParseClass::ParseClass(QObject *parent) : QObject(parent) { } void ParseClass::clearJsonObject(QJsonObject &object) { QStringList strList = object.keys(); for(int i = 0; i < strList.size(); ++i) { object.remove(strList.at(i)); } } void ParseClass::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 ParseClass::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(); file.close(); 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(); QStringList rootKeys=rootObject.keys(); qDebug()<<rootKeys<<"\r\n"; for(auto&rootKey:rootKeys){ qDebug()<<rootKey<<"\r\n"; //heartData QJsonValue rootJsonValue = rootObject.value(rootKey); QJsonArray rootJsonArrays = rootJsonValue.toArray(); for(auto iter = rootJsonArrays.constBegin(); iter != rootJsonArrays.constEnd(); ++iter){ QJsonObject branchObject = (*iter).toObject(); //I1所屬 QStringList branchKeys=branchObject.keys(); for(auto&branchKey:branchKeys){ qDebug()<<" "<<branchKey<<"\r\n"; //I1 QJsonValue leafJsonValue = branchObject.value(branchKey); QJsonObject leafObject = leafJsonValue.toObject(); //I1所屬 QStringList leafKeys=leafObject.keys(); for(auto&leafKey:leafKeys){ double value=leafObject.value(leafKey).toDouble(); qDebug()<<" "<<leafKey<<":"<<value<<"\r\n"; //quality } } } } }