一、Qt中對Json操作封裝的類
1. QJsonArray
2. QJsonDocument
3. QJsonObject
4. QJsonParseError
5. QJsonValue
二、各類詳細說明
1. QJsonArray
QJsonArray 類封裝了一個 JSON 數組。
JSON 數組是值的列表。列表可以被操作,通過從數組中插入和刪除 QJsonValue 。
一個 QJsonArray 可以和一個 QVariantList 相互轉換。可以使用 size() 來查詢條目的數量,通過 insert() 在指定索引處插入值,removeAt() 來刪除指定索引的值。支持標準C++的迭代器。
QJsonArray是一個隱式共享類,只要它沒有被修改,就會與創建它的文檔共享數據。
QJsonArray對象和基於文本的JSON可以通過QJsonDocument進行相互轉換。
2. QJsonDocument
QJsonDocument類提供了讀寫JSON文檔的方法。
QJsonDocument是一個封裝了完整JSON文檔的類,可以從基於UTF-8編碼的文本或者Qt的二進制格式讀寫此文檔。
可以使用QJsonDocument :: fromJson()將JSON文檔從其基於文本的表示轉換爲QJsonDocument。
可以使用QJsonDocument :: toJson()將其轉換回文本。
解析器非常快速有效,並將JSON轉換爲Qt使用的二進制表示。
可以使用!isNull()查詢已解析文檔的有效性
可以使用isArray()和isObject()查詢文檔是否包含數組或對象。
可以使用array()或object()檢索文檔中包含的數組或對象,然後進行讀取或操作。
還可以使用fromBinaryData()或fromRawData()從存儲的二進制表示創建文檔。
3. QJsonObject
QJsonObject 類封裝了一個 JSON 對象。
一個 JSON 對象是一個“key/value 對”列表,key 是獨一無二的字符串,value 由一個 QJsonValue 表示。
一個 QJsonObject 可以和一個 QVariantMap 相互轉換。
可以使用 size() 來查詢“key/value 對”的數量,
通過 insert() 插入“key/value 對”, remove() 刪除指定的 key。
QJsonObject是一個隱式共享類,只要它沒有被修改,就會與創建它的文檔共享數據。
QJsonObject對象和基於文本的JSON可以通過QJsonDocument進行相互轉換。
4. QJsonParseError
QJsonParseError類用於在JSON解析期間報告錯誤。
枚舉QJsonParseError :: ParseError
該枚舉描述了在解析JSON文檔期間發生的錯誤類型。
Constant | Value | Description |
---|---|---|
QJsonParseError::NoError | 0 | 沒有發生錯誤 |
QJsonParseError::UnterminatedObject | 1 | 對象沒有正確地用大括號括起來 |
QJsonParseError::MissingNameSeparator | 2 | 缺少分隔不同項目的逗號 |
QJsonParseError::UnterminatedArray | 3 | 數組未正確用方括號括起來 |
QJsonParseError::MissingValueSeparator | 4 | 缺少將鍵與對象內的值分隔開的冒號 |
QJsonParseError::IllegalValue | 5 | 該值是非法的 |
QJsonParseError::TerminationByNumber | 6 | 輸入流在解析數字時結束 |
QJsonParseError::IllegalNumber | 7 | 數字格式不正確 |
QJsonParseError::IllegalEscapeSequence | 8 | 輸入中發生非法轉義序列 |
QJsonParseError::IllegalUTF8String | 9 | 輸入中出現非法的UTF8序列 |
QJsonParseError::UnterminatedString | 10 | 字符串未以引號終止 |
QJsonParseError::MissingObject | 11 | 預期有一個對象,但找不到 |
QJsonParseError::DeepNesting | 12 | JSON文檔嵌套太深,解析器無法對其進行解析 |
QJsonParseError::DocumentTooLarge | 13 | JSON文檔太大,解析器無法對其進行解析 |
QJsonParseError::GarbageAtEnd | 14 | 解析的文檔末尾包含其他垃圾字符 |
5. QJsonValue
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相反,不會嘗試進行任何隱式類型轉換。 這意味着轉換爲未存儲在值中的類型將返回默認的構造返回值。
三、實例
Json實例文本如下:
{
"Data": [ //QJsonObject rootObject
{
"myApple": { //QJsonObject branchObject
"color": red, //QJsonObject leafObject
"weight": 2 //QJsonObject leafObject
}
},
{
"myWatermelon": {
"color": green,
"weight": 5.2
}
},
{
"myHeight": { //QJsonObject branchObject
"value": 180 //QJsonObject leafObject
}
},
{
"myWeight": {
"value": 60
}
}
]
}
寫Json文件
//創建並寫入Json文件
void JsonObj::createJsonFile(const QString& fileName)
{
QJsonArray jsonArray;
QJsonObject rootObject;
QJsonObject branchObject;
QJsonObject leafObject;
leafObject.insert("color", "red"); //先寫葉子結點
leafObject.insert("weight", 2);
branchObject.insert("myApple", leafObject); //父結點插入葉子結點
jsonArray.append(branchObject); //最後把父結點加入到Json數組中
clearJsonObject(leafObject); //清空數據
clearJsonObject(branchObject);
leafObject.insert("color", "green");
leafObject.insert("weight", 5.2);
branchObject.insert("myWatermelon", leafObject);
jsonArray.append(branchObject);
clearJsonObject(leafObject);
clearJsonObject(branchObject);
leafObject.insert("value", 180);
branchObject.insert("myHeight", leafObject);
jsonArray.append(branchObject);
clearJsonObject(leafObject);
clearJsonObject(branchObject);
leafObject.insert("value", 60);
branchObject.insert("myWeight", leafObject);
jsonArray.append(branchObject);
clearJsonObject(leafObject);
clearJsonObject(branchObject);
rootObject.insert("Data", jsonArray); //最後把Json數組插入到根結點
//初始化JsonDocument
QJsonDocument jsonDocument;
jsonDocument.setObject(rootObject);
//JsonDocument轉爲ByteArray
QByteArray byteArray = jsonDocument.toJson(QJsonDocument::Indented);
//寫入文件,fileNama爲Json文件路徑 :./Data.json
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 JsonObj::clearJsonObject(QJsonObject& object)
{
QStringList strList = object.keys();
for (int i = 0; i < strList.size(); ++i) {
object.remove(strList.at(i));
}
}
讀Json文件(解析Json文件)
實例Json文本如下:
{
"Data": [
{
"myApple": {
"color": "red",
"weight": 2
}
},
{
"myWatermelon": {
"color": "green",
"weight": 5.2
}
},
{
"myHeight": {
"value": 180
}
},
{
"myWeight": {
"value": 60
}
}
],
"data2": [
{
"myKeys": {
"color": "key",
"weight": 5
}
}
]
}
代碼如下:
void JsonObj::parseJsonFile(const QString& fileName)
{
//打開Json文件並用QByteArray讀取全部內容
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();
//讀取的全部內容轉爲QJsonDocument,如果報錯則輸出錯誤信息
QJsonParseError jsonParseError;
QJsonDocument jsonDocument(QJsonDocument::fromJson(array, &jsonParseError));
if (QJsonParseError::NoError != jsonParseError.error) {
qDebug() << QString("JsonParseError: %1").arg(jsonParseError.errorString());
return;
}
//QJsonDocument轉爲QJsonObject
QJsonObject rootObject = jsonDocument.object();
//獲取根結點
QStringList keys = rootObject.keys();
for (int i = 0; i < keys.size(); i++) {
qDebug() << "key" << i << " is:" << keys.at(i);
}
//根據獲取到的根結點繼續獲取二級結點
for (int i = 0; i < keys.size(); i++) {
if (rootObject.contains(keys.at(i)) && rootObject[keys.at(i)].isArray()) {
QJsonArray subArray = rootObject.value(keys.at(i)).toArray();
for (int i = 0; i < subArray.size(); i++) {
if (subArray[i].isObject()) {
QStringList subKeys = subArray[i].toObject().keys();
for (int m = 0; m < subKeys.size(); m++) {
qDebug() << "Subkey is:" << subKeys.at(m);
//根據獲取到的二級結點繼續獲取三級結點
QJsonObject subObj = subArray[i].toObject()[subKeys.at(m)].toObject();
QStringList subObjKeys = subObj.keys();
if (subArray[i].toObject().contains(subKeys.at(m)) && subArray[i].toObject()[subKeys.at(m)].isObject()) {
if (subObj.contains("color") && subObj["color"].isString()) {
qDebug() << "color is:" << subObj["color"].toString();
}
if (subObj.contains("weight") && subObj["weight"].isDouble()) {
qDebug() << "weight is:" << subObj["weight"].toDouble();
}
if (subObj.contains("value") && subObj["value"].isDouble()) {
qDebug() << "value is:" << subObj["value"].toDouble();
}
}
}
}
}
}
}
}
輸出內容如下:
key 0 is: "Data"
key 1 is: "data2"
Subkey is: "myApple"
color is: "red"
weight is: 2
Subkey is: "myWatermelon"
color is: "green"
weight is: 5.2
Subkey is: "myHeight"
value is: 180
Subkey is: "myWeight"
value is: 60
Subkey is: "myKeys"
color is: "key"
weight is: 5