QJsonDocument實現Qt下JSON文檔讀寫
阿新 • • 發佈:2017-12-17
處理 兩個 jsonp character 文件讀寫 ring byte binary name 版權聲明:若無來源註明,Techie亮博客文章均為原創。 轉載請以鏈接形式標明本文標題和地址:
本文標題:QJsonDocument實現Qt下JSON文檔讀寫 本文地址:http://techieliang.com/2017/12/718/ 文章目錄
本文標題:QJsonDocument實現Qt下JSON文檔讀寫 本文地址:http://techieliang.com/2017/12/718/ 文章目錄
- 1. 介紹
- 1.1. 錯誤分類
- 1.2. Json內容讀寫
- 1.3. 數據類型
- 2. 讀寫操作
- 2.1. json範例
- 3. 創建
- 4. 解析
- 5. 其他
1. 介紹
Qt提供了一系列類以供進行Json 文檔的讀寫,分別為:
QJsonDocumentJson文檔、QJsonArray數組、QJsonObject對象、QJsonValue值、QJsonParseError錯誤。
1.1. 錯誤分類
Constant | Value | Description |
---|---|---|
QJsonParseError::NoError |
0 |
No error occurred |
QJsonParseError::UnterminatedObject |
1 |
An object is not correctly terminated with a closing curly bracket |
QJsonParseError::MissingNameSeparator |
2 |
A comma separating different items is missing |
QJsonParseError::UnterminatedArray |
3 |
The array is not correctly terminated with a closing square bracket |
QJsonParseError::MissingValueSeparator |
4 |
A colon separating keys from values inside objects is missing |
QJsonParseError::IllegalValue |
5 |
The value is illegal |
QJsonParseError::TerminationByNumber |
6 |
The input stream ended while parsing a number |
QJsonParseError::IllegalNumber |
7 |
The number is not well formed |
QJsonParseError::IllegalEscapeSequence |
8 |
An illegal escape sequence occurred in the input |
QJsonParseError::IllegalUTF8String |
9 |
An illegal UTF8 sequence occurred in the input |
QJsonParseError::UnterminatedString |
10 |
A string wasn’t terminated with a quote |
QJsonParseError::MissingObject |
11 |
An object was expected but couldn’t be found |
QJsonParseError::DeepNesting |
12 |
The JSON document is too deeply nested for the parser to parse it |
QJsonParseError::DocumentTooLarge |
13 |
The JSON document is too large for the parser to parse it |
QJsonParseError::GarbageAtEnd |
14 |
The parsed document contains additional garbage characters at the end |
1.2. Json內容讀寫
QJsonDocument::toJson可以生成json文檔,具有可選參數,可以生成緊湊結構和縮進結構:
Constant | Value | Description |
---|---|---|
QJsonDocument::Indented |
0 |
Defines human readable output as follows:
{
"Array": [
true,
999,
"string"
],
"Key": "Value",
"null": null
}
|
QJsonDocument::Compact |
1 |
Defines a compact output as follows:
{"Array":[true,999,"string"],"Key":"Value","null":null}
|
除此以外還可以用toBinaryData、toVariant用於結果輸出
QJsonDocument除了使用構造函數創建以外,還支持靜態函數創建,主要用於讀取已有文件的內容:
- QJsonDocument fromBinaryData(const QByteArray &data, DataValidation validation = Validate)
- QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR)
- QJsonDocument fromRawData(const char *data, int size, DataValidation validation = Validate)
- QJsonDocument fromVariant(const QVariant &variant)
QJsonDocument並不會直接操作文件,需要自行利用QFile進行readAll或者Write
fromRawData/fromBinaryData並不會返回QJsonParseError錯誤而是直接返回DataValidation枚舉類型,表明讀取的數據是否有效
Constant | Value | Description |
---|---|---|
QJsonDocument::Validate |
0 |
Validate the data before using it. This is the default. |
QJsonDocument::BypassValidation |
1 |
Bypasses data validation. Only use if you received the data from a trusted place and know it’s valid, as using of invalid data can crash the application. |
1.3. 數據類型
QJsonValue用於存儲所有值,可以用type判斷其類型,含以下類型
Constant | Value | Description |
---|---|---|
QJsonValue::Null |
0x0 |
A Null value |
QJsonValue::Bool |
0x1 |
A boolean value. Use toBool() to convert to a bool. |
QJsonValue::Double |
0x2 |
A double. Use toDouble() to convert to a double. |
QJsonValue::String |
0x3 |
A string. Use toString() to convert to a QString. |
QJsonValue::Array |
0x4 |
An array. Use toArray() to convert to a QJsonArray. |
QJsonValue::Object |
0x5 |
An object. Use toObject() to convert to a QJsonObject. |
QJsonValue::Undefined |
0x80 |
The value is undefined. This is usually returned as an error condition, when trying to read an out of bounds value in an array or a non existent key in an object. |
也可以通過isXXXX用於判斷,並通過toXXXX轉換為對應類型
2. 讀寫操作
2.1. json範例
- {
- "Array": [
- true,
- 999,
- "string"
- ],
- "Key": "Value",
- "null": null
- }
3. 創建
- #include <QCoreApplication>
- #include <QJsonDocument>//json文檔
- #include <QJsonArray>//json數組
- #include <QJsonObject>//json對象
- #include <QJsonValue>//json值
- #include <QJsonParseError>//錯誤處理
- #include <QDebug>
- int main(int argc, char *argv[]) {
- QCoreApplication a(argc, argv);
- QJsonDocument json;
- QJsonArray array;
- array.append(true);
- array.append(999);
- array.append("string");
- QJsonObject object;
- object.insert("Array",array);
- object.insert("Key","Value");
- //null用空的QJsonValue即可
- object.insert("null",QJsonValue());
- //最外層是大括號所以是object
- json.setObject(object);
- qDebug()<<json.toJson(QJsonDocument::Compact);
- return 0;
- }
此時使用QJsonDocument::Compact方式寫出,其結果為:
“{\”Array\”:[true,999,\”string\”],\”Key\”:\”Value\”,\”null\”:null}”
QDebug會將\n直接輸出成\n而不會換行
4. 解析
- #include <QCoreApplication>
- #include <QJsonDocument>//json文檔
- #include <QJsonArray>//json數組
- #include <QJsonObject>//json對象
- #include <QJsonValue>//json值
- #include <QJsonParseError>//錯誤處理
- #include <QDebug>
- int main(int argc, char *argv[]) {
- QCoreApplication a(argc, argv);
- QJsonDocument json;
- QJsonArray array;
- array.append(true);
- array.append(999);
- array.append("string");
- QJsonObject object;
- object.insert("Array",array);
- object.insert("Key","Value");
- //null用空的QJsonValue即可
- object.insert("null",QJsonValue());
- //最外層是大括號所以是object
- json.setObject(object);
- auto json_text = json.toJson(QJsonDocument::Compact);
- auto json_binary = json.toBinaryData();
- QJsonDocument read1 = QJsonDocument::
- fromJson(json_text);
- QJsonDocument read2 = QJsonDocument::
- fromBinaryData(json_binary);
- //驗證兩個是一樣的
- if(QString(read1.toBinaryData()) ==
- QString(read2.toBinaryData()))
- qDebug()<<"same";
- //用於判斷是否為空,對QJsonXXX對象均支持
- if(!read1.isEmpty())
- qDebug()<<"empty";
- //下面開始解析代碼
- if(read1.isObject() ) {
- auto read_object = read1.object();
- if(!read_object.isEmpty()) {
- qDebug()<<read_object.value("Key").toString();
- qDebug()<<read_object.value("null").isNull();
- QJsonValue value = read_object.value("Array");
- qDebug()<<value.type()<<value;
- if(value.isArray()) {
- auto read_array = value.toArray();
- for(auto one_of_array : read_array)
- qDebug()<<one_of_array;
- //此處建議判斷好具體類型,因為array裏面也可能有object
- }
- }
- }
- return 0;
- }
結果
- same
- empty
- "Value"
- true
- 4 QJsonValue(array, QJsonArray([true,999,"string"]))
- QJsonValue(bool, true)
- QJsonValue(double, 999)
- QJsonValue(string, "string")
根據正常的結構進行判斷即可,對於array需要進行遍歷,支持C++的for(:)方式遍歷
fromJson、fromBinaryData、fromRawData、fromVariant這幾個靜態函數都不會直接返回成功與否,而是在參數中實現解析結果判斷,正式使用時務必進行判斷,避免後續代碼均出錯
5. 其他
- 對於每一步建議明確判斷QJsonValut的type如果type錯誤,會輸出為””,比如int類型用toString不會自動轉換,而是直接寫出””
- 相比於Qt使用core模塊的xml讀寫,json操作很簡單,不需要逐行的讀取操作使用readNext,獲取內容的順序與文本順序可以不一致,xml使用請見文章:QXmlStreamReader/QXmlStreamWriter實現Qt下xml文件讀寫
- 上面介紹的例子最外層為object,也支持最外層為array,使用setArray即可,最外層只能為一種,不能不斷的add
- QJsonDocument主要負責的是數據文本格式或者說是表現方式的轉換,其余類負責內容
- QJsonArray可以用size獲取數組的大小,後續操作感覺類似於QList<QVariant> ,也具有叠代器
- QJsonParseError使用方式自行查看,主要是在解析時出現,但均不會作為返回值直接返回,在QJsonDocument::fromJson處使用,其余幾個靜態fromXXX函數直接返回枚舉類型,此類操作均不可保證絕對正確,故應當做判斷避免後續連鎖錯誤。
轉載請以鏈接形式標明本文標題和地址:Techie亮博客 » QJsonDocument實現Qt下JSON文檔讀寫
QJsonDocument實現Qt下JSON文檔讀寫