Qt讀寫Json操作

一、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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章