日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QJason

發布時間:2025/3/19 编程问答 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QJason 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

從 Qt 5.0 開始提供了對 Json 的支持,我們可以直接使用 Qt 提供的 Json 類進行數據的組織和解析。相關的類常用的主要有四個,具體如下:

Json 類

介紹

QJsonDocument

它封裝了一個完整的 JSON 文檔,并且可以從 UTF-8 編碼的基于文本的表示以及 Qt 自己的二進制格式讀取和寫入該文檔。

QJsonArray

JSON 數組是一個值列表。可以通過從數組中插入和刪除 QJsonValue 來操作該列表。

QJsonObject

JSON 對象是鍵值對的列表,其中鍵是唯一的字符串,值由 QJsonValue 表示。

QJsonValue

該類封裝了 JSON 支持的數據類型。


1. QJsonValue

在 Qt 中 QJsonValue 可以封裝的基礎數據類型有六種(和 Json 支持的類型一致),分別為:

  • 布爾類型:QJsonValue::Bool

  • 浮點類型(包括整形): QJsonValue::Double

  • 字符串類型: QJsonValue::String

  • Json 數組類型: QJsonValue::Array

  • Json 對象類型:QJsonValue::Object

  • 空值類型: QJsonValue::Null

這個類型可以通過 QJsonValue 的構造函數被封裝為一個類對象:

// Json對象 QJsonValue(const QJsonObject &o); // Json數組 QJsonValue(const QJsonArray &a); // 字符串 QJsonValue(const char *s); QJsonValue(QLatin1String s); QJsonValue(const QString &s); // 整形 and 浮點型 QJsonValue(qint64 v); QJsonValue(int v); QJsonValue(double v); // 布爾類型 QJsonValue(bool b); // 空值類型 QJsonValue(QJsonValue::Type type = Null);

?如果我們得到一個 QJsonValue 對象,如何判斷內部封裝的到底是什么類型的數據呢?這時候就需要調用相關的判斷函數了,具體如下

// 是否是Json數組 bool isArray() const; // 是否是Json對象 bool isObject() const; // 是否是布爾類型 bool isBool() const; // 是否是浮點類型(整形也是通過該函數判斷) bool isDouble() const; // 是否是空值類型 bool isNull() const; // 是否是字符串類型 bool isString() const; // 是否是未定義類型(無法識別的類型) bool isUndefined() const;

通過判斷函數得到對象內部數據的實際類型之后,如果有需求就可以再次將其轉換為對應的基礎數據類型,對應的 API 函數如下:?

// 轉換為Json數組 QJsonArray toArray(const QJsonArray &defaultValue) const; QJsonArray toArray() const; // 轉換為布爾類型 bool toBool(bool defaultValue = false) const; // 轉換為浮點類型 double toDouble(double defaultValue = 0) const; // 轉換為整形 int toInt(int defaultValue = 0) const; // 轉換為Json對象 QJsonObject toObject(const QJsonObject &defaultValue) const; QJsonObject toObject() const; // 轉換為字符串類型 QString toString() const; QString toString(const QString &defaultValue) const;

2、?QJsonObject

QJsonObject 封裝了 Json 中的對象,在里邊可以存儲多個鍵值對,為了方便操作,鍵值為字符串類型,值為 QJsonValue 類型。關于這個類的使用類似于 C++ 中的 STL 類,仔細閱讀 API 文檔即可熟練上手使用,下面介紹一些常用 API 函數:

2.1如何創建空的 Json 對象

QJsonObject::QJsonObject();?? ?// 構造空對象

2.2將鍵值對添加到空對象中

iterator QJsonObject::insert(const QString &key, const QJsonValue &value);

2.3獲取對象中鍵值對個數

int QJsonObject::count() const;
int QJsonObject::size() const;
int QJsonObject::length() const;

2.4通過 key 得到 value

JsonValue QJsonObject::value(const QString &key) const; ? ?// utf8
QJsonValue QJsonObject::value(QLatin1String key) const;?? ? ? ?// 字符串不支持中文
QJsonValue QJsonObject::operator[](const QString &key) const;
QJsonValue QJsonObject::operator[](QLatin1String key) const;

2.5刪除鍵值對

void QJsonObject::remove(const QString &key);
QJsonValue QJsonObject::take(const QString &key);?? ?// 返回key對應的value值

2.6通過 key 進行查找
iterator QJsonObject::find(const QString &key);
bool QJsonObject::contains(const QString &key) const;

2.7遍歷,方式有三種:

  • 使用相關的迭代器函數
  • 使用 [] 的方式遍歷,類似于遍歷數組,[] 中是鍵值
  • 先得到對象中所有的鍵值,在遍歷鍵值列表,通過 key 得到 value 值

QStringList QJsonObject::keys() const;


3、QJsonArray

QJsonArray 封裝了 Json 中的數組,在里邊可以存儲多個元素,為了方便操作,所有的元素類統一為 QJsonValue 類型。關于這個類的使用類似于 C++ 中的 STL 類,仔細閱讀 API 文檔即可熟練上手使用,下面介紹一些常用 API 函數:

3.1創建空的 Json 數組

QJsonArray::QJsonArray();

3.2創建空的 Json 數組

void QJsonArray::append(const QJsonValue &value);?? ?// 在尾部追加
void QJsonArray::insert(int i, const QJsonValue &value); // 插入到 i 的位置之前
iterator QJsonArray::insert(iterator before, const QJsonValue &value);
void QJsonArray::prepend(const QJsonValue &value); // 添加到數組頭部
void QJsonArray::push_back(const QJsonValue &value); // 添加到尾部
void QJsonArray::push_front(const QJsonValue &value); // 添加到頭部

3.3計算數組元素的個數

int QJsonArray::count() const;
int QJsonArray::size() const;

3.4從數組中取出某一個元素的值

QJsonValue QJsonArray::at(int i) const;
QJsonValue QJsonArray::first() const; // 頭部元素
QJsonValue QJsonArray::last() const; // 尾部元素
QJsonValueRef QJsonArray::operator[](int i);

3.5刪除數組中的某一個元素

iterator QJsonArray::erase(iterator it); ? ?// 基于迭代器刪除
void QJsonArray::pop_back(); ? ? ? ? ? // 刪除尾部
void QJsonArray::pop_front(); ? ? ? ? ?// 刪除頭部
void QJsonArray::removeAt(int i); ? ? ?// 刪除i位置的元素
void QJsonArray::removeFirst(); ? ? ? ?// 刪除頭部
void QJsonArray::removeLast(); ? ? ? ? // 刪除尾部
QJsonValue QJsonArray::takeAt(int i); ?// 刪除i位置的原始, 并返回刪除的元素的值

3.6Josn 數組的遍歷,常用的方式有兩種:

  • 可以使用迭代器進行遍歷(和使用迭代器遍歷 STL 容器一樣)
  • 可以使用數組的方式遍歷


?4. QJsonDocument

它封裝了一個完整的 JSON 文檔,并且可以從 UTF-8 編碼的基于文本的表示以及 Qt 自己的二進制格式讀取和寫入該文檔。QJsonObject QJsonArray 這兩個對象中的數據是不能直接轉換為字符串類型的,如果要進行數據傳輸或者數據的持久化,操作的都是字符串類型而不是 QJsonObject 或者 QJsonArray 類型,我們需要通過一個 Json 文檔類進行二者之間的轉換。

下面依次介紹一下這兩個轉換流程應該如何操作:

4.1、QJsonObject 或者 QJsonArray ===> 字符串

  • 1、創建 QJsonDocument 對象

QJsonDocument::QJsonDocument(const QJsonObject &object);
QJsonDocument::QJsonDocument(const QJsonArray &array);

可以看出,通過構造函數就可以將實例化之后的 **QJsonObject 或者 QJsonArray ** 轉換為 QJsonDocument 對象了。

  • 2、將文件對象中的數據進行序列化

// 二進制格式的json字符串
QByteArray QJsonDocument::toBinaryData() const;?? ??
// 文本格式
QByteArray QJsonDocument::toJson(JsonFormat format = Indented) const;?? ?

通過調用 toxxx() 方法就可以得到文本格式或者二進制格式的 Json 字符串了。

  • 3、使用得到的字符串進行數據傳輸,或者磁盤文件持久化

4.2?字符串 ===> QJsonObject 或者 QJsonArray

一般情況下,通過網絡通信或者讀磁盤文件就會得到一個 Json 格式的字符串,如果想要得到相關的原始數據就需要對字符串中的數據進行解析,具體解析流程如下:

  • 1、將得到的 Json 格式字符串通過 QJsonDocument 類的靜態函數轉換為 QJsonDocument 類對象

[static] QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation = Validate);
// 參數文件格式的json字符串
[static] QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR);

  • 2、將文檔對象轉換為 json 數組 / 對象

// 判斷文檔對象中存儲的數據是不是數組
bool QJsonDocument::isArray() const;
// 判斷文檔對象中存儲的數據是不是json對象
bool QJsonDocument::isObject() const
? ??
// 文檔對象中的數據轉換為json對象
QJsonObject QJsonDocument::object() const;
// 文檔對象中的數據轉換為json數組
QJsonArray QJsonDocument::array() const;

  • 3、通過調用 QJsonArray , QJsonObject 類提供的 API 讀出存儲在對象中的數據。

讀文件?

void writeJson() {QJsonObject obj;obj.insert("Name", "Ace");obj.insert("Sex", "man");obj.insert("Age", 20);QJsonObject subObj;subObj.insert("Father", "Gol·D·Roger");subObj.insert("Mother", "Portgas·D·Rouge");QJsonArray array;array.append("Sabo");array.append("Monkey D. Luffy");subObj.insert("Brother", array);obj.insert("Family", subObj);obj.insert("IsAlive", false);obj.insert("Comment", "yyds");QJsonDocument doc(obj);QByteArray json = doc.toJson();QFile file("d:\\ace.json");file.open(QFile::WriteOnly);file.write(json);file.close(); }

寫文件

void MainWindow::readJson() {QFile file("d:\\ace.json");file.open(QFile::ReadOnly);QByteArray json = file.readAll();file.close();QJsonDocument doc = QJsonDocument::fromJson(json);if(doc.isObject()){QJsonObject obj = doc.object();QStringList keys = obj.keys();for(int i=0; i<keys.size(); ++i){QString key = keys.at(i);QJsonValue value = obj.value(key);if(value.isBool()){qDebug() << key << ":" << value.toBool();}if(value.isString()){qDebug() << key << ":" << value.toString();}if(value.isDouble()){qDebug() << key << ":" << value.toInt();}if(value.isObject()){qDebug()<< key << ":";// 直接處理內部鍵值對, 不再進行類型判斷的演示QJsonObject subObj = value.toObject();QStringList ls = subObj.keys();for(int i=0; i<ls.size(); ++i){QJsonValue subVal = subObj.value(ls.at(i));if(subVal.isString()){qDebug() << " " << ls.at(i) << ":" << subVal.toString();}if(subVal.isArray()){QJsonArray array = subVal.toArray();qDebug() << " " << ls.at(i) << ":";for(int j=0; j<array.size(); ++j){// 因為知道數組內部全部為字符串, 不再對元素類型進行判斷qDebug() << " " << array[j].toString();}}}}}} }

?

總結

以上是生活随笔為你收集整理的QJason的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。