1. 程式人生 > >QJsonDocument實現Qt下JSON文檔讀寫

QJsonDocument實現Qt下JSON文檔讀寫

處理 兩個 jsonp character 文件讀寫 ring byte binary name

版權聲明:若無來源註明,Techie亮博客文章均為原創。 轉載請以鏈接形式標明本文標題和地址:
本文標題: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. 錯誤分類

ConstantValueDescription
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文檔,具有可選參數,可以生成緊湊結構和縮進結構:

ConstantValueDescription
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}

除此以外還可以用toBinaryDatatoVariant用於結果輸出

QJsonDocument除了使用構造函數創建以外,還支持靜態函數創建,主要用於讀取已有文件的內容:

  1. QJsonDocument fromBinaryData(const QByteArray &data, DataValidation validation = Validate)
  2. QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR)
  3. QJsonDocument fromRawData(const char *data, int size, DataValidation validation = Validate)
  4. QJsonDocument fromVariant(const QVariant &variant)

QJsonDocument並不會直接操作文件,需要自行利用QFile進行readAll或者Write

fromRawData/fromBinaryData並不會返回QJsonParseError錯誤而是直接返回DataValidation枚舉類型,表明讀取的數據是否有效

ConstantValueDescription
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判斷其類型,含以下類型

ConstantValueDescription
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範例

  1. {
  2. "Array": [
  3. true,
  4. 999,
  5. "string"
  6. ],
  7. "Key": "Value",
  8. "null": null
  9. }

3. 創建

  1. #include <QCoreApplication>
  2. #include <QJsonDocument>//json文檔
  3. #include <QJsonArray>//json數組
  4. #include <QJsonObject>//json對象
  5. #include <QJsonValue>//json值
  6. #include <QJsonParseError>//錯誤處理
  7. #include <QDebug>
  8. int main(int argc, char *argv[]) {
  9. QCoreApplication a(argc, argv);
  10. QJsonDocument json;
  11. QJsonArray array;
  12. array.append(true);
  13. array.append(999);
  14. array.append("string");
  15. QJsonObject object;
  16. object.insert("Array",array);
  17. object.insert("Key","Value");
  18. //null用空的QJsonValue即可
  19. object.insert("null",QJsonValue());
  20. //最外層是大括號所以是object
  21. json.setObject(object);
  22. qDebug()<<json.toJson(QJsonDocument::Compact);
  23. return 0;
  24. }

此時使用QJsonDocument::Compact方式寫出,其結果為:

“{\”Array\”:[true,999,\”string\”],\”Key\”:\”Value\”,\”null\”:null}”

QDebug會將\n直接輸出成\n而不會換行

4. 解析

  1. #include <QCoreApplication>
  2. #include <QJsonDocument>//json文檔
  3. #include <QJsonArray>//json數組
  4. #include <QJsonObject>//json對象
  5. #include <QJsonValue>//json值
  6. #include <QJsonParseError>//錯誤處理
  7. #include <QDebug>
  8. int main(int argc, char *argv[]) {
  9. QCoreApplication a(argc, argv);
  10. QJsonDocument json;
  11. QJsonArray array;
  12. array.append(true);
  13. array.append(999);
  14. array.append("string");
  15. QJsonObject object;
  16. object.insert("Array",array);
  17. object.insert("Key","Value");
  18. //null用空的QJsonValue即可
  19. object.insert("null",QJsonValue());
  20. //最外層是大括號所以是object
  21. json.setObject(object);
  22. auto json_text = json.toJson(QJsonDocument::Compact);
  23. auto json_binary = json.toBinaryData();
  24. QJsonDocument read1 = QJsonDocument::
  25. fromJson(json_text);
  26. QJsonDocument read2 = QJsonDocument::
  27. fromBinaryData(json_binary);
  28. //驗證兩個是一樣的
  29. if(QString(read1.toBinaryData()) ==
  30. QString(read2.toBinaryData()))
  31. qDebug()<<"same";
  32. //用於判斷是否為空,對QJsonXXX對象均支持
  33. if(!read1.isEmpty())
  34. qDebug()<<"empty";
  35. //下面開始解析代碼
  36. if(read1.isObject() ) {
  37. auto read_object = read1.object();
  38. if(!read_object.isEmpty()) {
  39. qDebug()<<read_object.value("Key").toString();
  40. qDebug()<<read_object.value("null").isNull();
  41. QJsonValue value = read_object.value("Array");
  42. qDebug()<<value.type()<<value;
  43. if(value.isArray()) {
  44. auto read_array = value.toArray();
  45. for(auto one_of_array : read_array)
  46. qDebug()<<one_of_array;
  47. //此處建議判斷好具體類型,因為array裏面也可能有object
  48. }
  49. }
  50. }
  51. return 0;
  52. }

結果

  1. same
  2. empty
  3. "Value"
  4. true
  5. 4 QJsonValue(array, QJsonArray([true,999,"string"]))
  6. QJsonValue(bool, true)
  7. QJsonValue(double, 999)
  8. QJsonValue(string, "string")

根據正常的結構進行判斷即可,對於array需要進行遍歷,支持C++的for(:)方式遍歷

fromJson、fromBinaryData、fromRawData、fromVariant這幾個靜態函數都不會直接返回成功與否,而是在參數中實現解析結果判斷,正式使用時務必進行判斷,避免後續代碼均出錯

5. 其他

  1. 對於每一步建議明確判斷QJsonValut的type如果type錯誤,會輸出為””,比如int類型用toString不會自動轉換,而是直接寫出””
  2. 相比於Qt使用core模塊的xml讀寫,json操作很簡單,不需要逐行的讀取操作使用readNext,獲取內容的順序與文本順序可以不一致,xml使用請見文章:QXmlStreamReader/QXmlStreamWriter實現Qt下xml文件讀寫
  3. 上面介紹的例子最外層為object,也支持最外層為array,使用setArray即可,最外層只能為一種,不能不斷的add
  4. QJsonDocument主要負責的是數據文本格式或者說是表現方式的轉換,其余類負責內容
  5. QJsonArray可以用size獲取數組的大小,後續操作感覺類似於QList<QVariant> ,也具有叠代器
  6. QJsonParseError使用方式自行查看,主要是在解析時出現,但均不會作為返回值直接返回,在QJsonDocument::fromJson處使用,其余幾個靜態fromXXX函數直接返回枚舉類型,此類操作均不可保證絕對正確,故應當做判斷避免後續連鎖錯誤。

轉載請以鏈接形式標明本文標題和地址:Techie亮博客 » QJsonDocument實現Qt下JSON文檔讀寫

QJsonDocument實現Qt下JSON文檔讀寫