分析網(wǎng)站建設(shè)流程seo流量排行榜神器
內(nèi)容來源于嗶站視頻,僅僅作為自己的筆記記錄,感興趣的小伙伴去原作品大call(此處給作者三鞠躬),Json以及Json在Qt中的使用 【Qt/C/C++】_嗶哩嗶哩_bilibili
目錄
1、Json介紹:
1.1 Json的定義
1.2 Json的數(shù)據(jù)格式
1.2.1 Json數(shù)組:
1.2.2 Json對象
1.2.3 注意事項(xiàng)
2、Qt提供的Json類的使用
2.1 Json類介紹
2.1.1 四個(gè)常用Json類
?編輯2.1.2 四個(gè)常用Json類之間的關(guān)系?
2.2 QJsonValue
2.2.1?封裝的數(shù)據(jù)類型6:
2.2.2 通過構(gòu)造函數(shù),將6種不同的類型統(tǒng)一。
2.3?QJsonObject
2.3.1 創(chuàng)建空的Json對象
2.3.2 將鍵值對添加到Json對象中
2.3.3 獲取對象中,鍵值對個(gè)數(shù)
2.3.4 通過key取出value
2.3.5 刪除鍵值對
2.3.6 通過key進(jìn)行查找
2.3.7 遍歷方式3種
?2.4?QJsonArray
2.4.1 創(chuàng)建空的Json數(shù)組
2.4.2 添加數(shù)據(jù)
2.4.3 計(jì)算數(shù)組內(nèi)元素的個(gè)數(shù)
2.4.4 從數(shù)組中取出某一個(gè)元素的值
2.4.5 從數(shù)組中刪除某一個(gè)元素的值
2.4.6 遍歷
2.6.7?QJsonObject和QJsonArray的區(qū)別
2.5 QJSonDocument
2.5.1 QJsonArray和QJsonObject->字符串
2.5.2 字符串->QJsonArray和QJsonObject?
3 Json文件操作的例子
3.1 主要運(yùn)用技術(shù)方法
3.2? Json文件序列化:writeJson函數(shù)代碼實(shí)現(xiàn)
3.2.1 序列化
3.2.2 QJsonArray或者QJsonObject===>字符串
3.3?Json文件反序列化:readJson函數(shù)實(shí)現(xiàn)
3.3.1 反序列
3.3.2 字符串===>QJsonArray或者 QJsonObject
3.4 整體代碼
3.4.1 mainwindow.h
3.4.2 mainwindow.cpp
1、Json介紹:
1.1 Json的定義
JSON(JavaScrip Object Notation)是一種輕量級的數(shù)據(jù)交換格式。它基于ECMAScript(歐洲計(jì)算機(jī)協(xié)會訂制的js規(guī)范)的一個(gè)子集,采用完全獨(dú)立于編程語言的文本格式來存儲和表示數(shù)據(jù)。簡潔和清晰的層次結(jié)構(gòu)使得JSON成為理想的數(shù)據(jù)交換語言。易于人閱讀和縮寫,同時(shí)也易于機(jī)器解析和生成,并有效地提升網(wǎng)絡(luò)傳輸效率。
簡述:Json是一種數(shù)據(jù)格式,和語言無關(guān),什么語言中都可以使用Json。基于這種通用的數(shù)據(jù)格式,一般處理兩方面的任務(wù):
? ? ? ? 1.組織數(shù)據(jù)(數(shù)據(jù)序列化),用于數(shù)據(jù)的網(wǎng)絡(luò)傳輸。
? ? ? ? 2.組織數(shù)據(jù)(數(shù)據(jù)序列化),寫磁盤文件實(shí)現(xiàn)數(shù)據(jù)的持久化存儲(一般.json作為作為文件后綴)
(什么時(shí)候需要數(shù)據(jù)持久化到磁盤?記住用戶名、密碼,簡單存儲到磁盤文件,通過加載本地配置文件,當(dāng)窗口顯示的時(shí)候就會加載配置文件,而不是讀取磁盤內(nèi)容,用戶體驗(yàn)會更好。)
1.2 Json的數(shù)據(jù)格式
Json中主要有兩種數(shù)據(jù)格式:Json數(shù)組和Json對象,并且這兩種格式可以交叉嵌套使用,下面一次介紹這兩種數(shù)據(jù)格式:
1.2.1 Json數(shù)組:
Json數(shù)組使用[]表示,[]里邊是元素,元素和元素之間使用“,”間隔開,最后一個(gè)元素后邊沒有逗號,一個(gè)Json數(shù)組中支持同時(shí)存在多種不同類型的成員,包括:整型、浮點(diǎn)、字符串、布爾類型、json數(shù)組、json對象、空值-null。由此可見Json數(shù)組比起c/c++數(shù)組靈活很多。
字符串要寫到雙引號(“”)里邊。
Json數(shù)組中嵌套Json數(shù)組,父子關(guān)系
Json數(shù)組嵌套Json對象,Json對象可以嵌套Json數(shù)組
(1)Json數(shù)組中的元素?cái)?shù)據(jù)類型一致
[1, 2, 3] //整型
["哈哈","hehe","yiyi"] //字符串
(2)Json數(shù)組中的元素?cái)?shù)據(jù)類型不一致
[1, 2, 3, true, false, "haha",null]
(3)Json數(shù)組中的數(shù)據(jù)嵌套使用
[["cat", "狗狗", "河馬", 1]//元素類型可以不一致[1, 3, 5, true]
]
(4)Json數(shù)組和Json對象嵌套
Json對象寫入Json數(shù)組,數(shù)組是父節(jié)點(diǎn),對象是子節(jié)點(diǎn),Json對象下的Json對象是三級節(jié)點(diǎn)(Key:value)。"小明"是key值,{}是小明的value值,屬性是鍵值對,
[//外層是Json數(shù)組{//內(nèi)層是Json對象"小明":{//屬性鍵值對"age":19,"father":"大華","sister":"小妹","sister1":"大妹" //sister鍵值不可以重復(fù)}}
]
1.2.2 Json對象
Json對象使用{}來描述,每個(gè)Json對象可以存儲若干個(gè)元素,每個(gè)元素對應(yīng)一個(gè)鍵值對(key:value),元素和元素之間使用 , 間隔,最后一個(gè)元素后面沒有 , 注意:
- 鍵值key,必須是字符串,位于同一層級的鍵值,不能重復(fù)(通過鍵值取出數(shù)據(jù)value)
- value值的類型是可選的,整形,浮點(diǎn)型,字符串,json數(shù)組,json對象,空值-null(null)?
使用Json對象描述一個(gè)人的信息:
{"NAME":"ACE","Sex":"man","Age":20,"Family":{"Father":"yiyi","brother":["aa","bb","cc"]},"IsLive":"true"
}
小細(xì)節(jié):最后一個(gè)鍵值對沒有逗號!!!
數(shù)據(jù)簡單放數(shù)組,數(shù)據(jù)更復(fù)雜放Json對象,數(shù)組和對象的嵌套使用可以更加完整描述模型!!!
(溫馨提示:邏輯關(guān)系確定清楚哦!!!)
1.2.3 注意事項(xiàng)
- 逗號(“,”)不能亂加,解析會出錯(cuò)。注意最后一個(gè)元素不能加逗號,否則解析出錯(cuò)。
- 鍵值不唯一,不能搜到到正確的value
- 數(shù)組持久化的過程中,后綴是".json"不是必須,但是推薦使用".json"
- 數(shù)據(jù)塊只允許有一個(gè)根節(jié)點(diǎn)
錯(cuò)誤示范:
?此處存入了兩個(gè)數(shù)據(jù)塊,存在兩個(gè)根節(jié)點(diǎn),是不允許的!!!
2、Qt提供的Json類的使用
2.1 Json類介紹
2.1.1 四個(gè)常用Json類
2.1.2 四個(gè)常用Json類之間的關(guān)系?
JsonValue包裝了Json支持的數(shù)據(jù)類型,JsonValue相當(dāng)于一個(gè)箱子,可以重載JsonValue得到不同數(shù)據(jù)類型。?
2.2 QJsonValue
2.2.1?封裝的數(shù)據(jù)類型6:
- bool類型 QJsonValue::Bool
- double類型 QJsonValue::Double
- string類型 QJsonVale::String
- array類型 QJsonValue.:Array
- object類型 QJsonValue:Object
- null了下 QJsonValue::Null
2.2.2 通過構(gòu)造函數(shù),將6種不同的類型統(tǒng)一。
類似于6種類型,放到一個(gè)箱子里面。
2.3?QJsonObject
封裝了Json中的對象,在里邊可以存儲多個(gè)鍵值對,為了方便操作,鍵值為字符串類型,值為QJsonValue類型,關(guān)于這個(gè)類的使用類似,C++中STL類 QJsonObject內(nèi)數(shù)據(jù)使用insert插入,根據(jù)key值,自動(dòng)排序,底層紅黑樹,升序
2.3.1 創(chuàng)建空的Json對象
QJsonObject::QJsonObject() //構(gòu)造空對象
2.3.2 將鍵值對添加到Json對象中
iterator QJsonObject::insert(const QString &key, const QJsonValue &value);//key value
2.3.3 獲取對象中,鍵值對個(gè)數(shù)
int QJsonObject::count() const;
int QJsonObject::size() const;
int QJsonObject::length() const;
2.3.4 通過key取出value
? ? ? ? ?傳入key:得到QJsonObject對象,看看是什么,在使用to方法,得到原始數(shù)據(jù)
1、QJsonValue QJsonObject:: value(const QString &key) const; //utf-8
2、QJsonValue QJsonObject:: value(QLatin1QString key) const; //字符串不支持中文
3、QJsonValue QJsonObject:: operator[](const QString &key) const; //使用的時(shí)候["key值"]
4、QJsonValue QJsonObject:: operator[](QLatin1QString key) const;
2.3.5 刪除鍵值對
void QJsonObject::remove(const QString &key);
QJsonValue QJsonObject::take(const QString &key); //刪除鍵值對后,返回value值
2.3.6 通過key進(jìn)行查找
iterator QJsonObject::find(const QString &key); //返回的是迭代器,解引用,可以得到數(shù)據(jù)value值 bool
QJsonObject::contains(const QString &key) const; //查看QJsonObject對象中,是否 存在這個(gè)key鍵值對
2.3.7 遍歷方式3種
1.使用迭代器函數(shù)
2.使用[],遍歷,類似遍歷數(shù)組,[]中是key
3.先得到對象中所有的鍵值,在遍歷鍵值列表,通過key得到value QStringList QJsonObject::keys() const;//得到當(dāng)前Json對象中所有的key值QStringList QJsonObject::keys() const;//得到當(dāng)前Json對象中所有的key值
細(xì)節(jié)+++:QJsonObject在插入時(shí)會根據(jù)鍵值對數(shù)據(jù)升序排序,而QJsonArray不會根據(jù)鍵值排序,所以QJsonObject插入數(shù)據(jù)順序完全由鍵值決定,因此插入順序和排序順序可能不同。但QJsonArray在插入數(shù)據(jù)的時(shí)候,數(shù)據(jù)存儲在同一塊連續(xù)內(nèi)存中,所以插入順序就是數(shù)據(jù)的排序順序。
?2.4?QJsonArray
- QJsonArray里面封裝了Json數(shù)組,里面存儲多個(gè)元素,為了方便操作,所有元素類型統(tǒng)一為QJsonValue類型
- 注意:QJsonArray內(nèi)元素是無序的,完全按照添加順序存儲。
- 先添加,放在前面,后添加放在后面。插入,就放在插入的位置。
2.4.1 創(chuàng)建空的Json數(shù)組
QJsonArray::QJsonArray() //得到空的Json數(shù)組,通過size()方法,返回值為0
2.4.2 添加數(shù)據(jù)
void QJsonArray::append(const QJsonValue &value); //在尾部追加
void QJsonArray::insert(int i, const QJsonValue &value); //插入到i的位置之前
iterator QJsonArray::insert(iterator before, const QJsonValue &value); //在迭代器當(dāng)前位置的前面,插入
void QJsonArray::prepend(const QJsonValue &value); //添加到數(shù)組頭部
void QJsonArray::push_back(const QJsonValue &value); //添加到尾部
void QJsonArray::push_front(const QJsonValue &value); //添加到頭部
2.4.3 計(jì)算數(shù)組內(nèi)元素的個(gè)數(shù)
int QJsonArray::count() const;
int QJsonArray::size() const;
2.4.4 從數(shù)組中取出某一個(gè)元素的值
QJsonValue QJsonArray::at(int i) const; //參數(shù)i:為在數(shù)組中元素對應(yīng)的下標(biāo) 拷貝,不能修改數(shù)組內(nèi)元素的值
QJsonValue QJsonArray::first() const; //頭部元素 拷貝
QJsonValue QJsonArray::last() const; //尾部元素 拷貝
QJsonValueRef QJsonArray::operator[](int i);//這里返回的值是引用,可以修改 數(shù)組內(nèi)的值
2.4.5 從數(shù)組中刪除某一個(gè)元素的值
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位置的原始,并返回刪除元素的值
2.4.6 遍歷
1、使用迭代器遍歷(和使用迭代器遍歷STL容器一樣)
2、使用數(shù)組方式遍歷
總結(jié):通過[]或者takeAt方法得到返回值為QJsonValue類型,通過返回?cái)?shù)據(jù)QJsonValue類型進(jìn)行判斷,然后調(diào)用“to”方法得到原始數(shù)據(jù)。取出的原始元素,不是我們需要的數(shù)據(jù)類型,需要"to方法"進(jìn)行換行。
2.6.7?QJsonObject和QJsonArray的區(qū)別
QJsonObject是用于表示JSON對象的類,它類似于C++中的std::map或字典數(shù)據(jù)結(jié)構(gòu),可以使用鍵值對存儲和訪問數(shù)據(jù)。每個(gè)鍵都是唯一的,與每個(gè)值關(guān)聯(lián)。QJsonObject內(nèi)部以鍵值對的形式組織數(shù)據(jù),其中鍵是字符串,值可以是字符串、數(shù)字、布爾值、其他JSON對象或JSON數(shù)組。
QJsonArray是用于表示JSON數(shù)組的類,它類似于C++中的std::vector或列表數(shù)據(jù)結(jié)構(gòu),可以按照索引順序存儲和訪問數(shù)據(jù)。QJsonArray可以包含多個(gè)元素,每個(gè)元素可以是字符串、數(shù)字、布爾值、其他JSON對象或JSON數(shù)組。
區(qū)別總結(jié)如下:
- QJsonObject用于表示JSON對象,通過鍵值對存儲和訪問數(shù)據(jù)。
- QJsonArray用于表示JSON數(shù)組,按照索引順序存儲和訪問數(shù)據(jù)。
在處理復(fù)雜的JSON數(shù)據(jù)時(shí),QJsonObject和QJsonArray經(jīng)常會一起使用。例如,一個(gè)JSON對象的值可以是一個(gè)JSON數(shù)組,而一個(gè)JSON數(shù)組的元素也可以是JSON對象。這樣的結(jié)構(gòu)可以通過嵌套使用QJsonObject和QJsonArray來表示。
請注意,在使用QJsonObject和QJsonArray之前,你需要包含相應(yīng)的頭文件#include <QJsonObject>
和#include <QJsonArray>
,并鏈接到QtCore模塊。
2.5 QJSonDocument
它封住了一個(gè)完整的Json文檔,并且可以從UTF-8編碼的基于文本的表示以及Qt自己的二進(jìn)制格式讀取和寫入該文檔。 QJsonObject和QJsonArray這兩個(gè)對象中的數(shù)據(jù)是不能直接轉(zhuǎn)換為字符串類型的, 如果要進(jìn)行數(shù)據(jù)傳輸或者數(shù)據(jù)的持久化,操作的都是字符串類型,不是QJsonArray或者QjsonObject類型, 需要使用JsonDocument進(jìn)行二者之間的轉(zhuǎn)換。?
2.5.1 QJsonArray和QJsonObject->字符串
- QJsonDocument(const QJsonDocument &other):移動(dòng)構(gòu)造 右值引用 不可取地址的數(shù)據(jù)
- QJsonDocument(QJsonDocument &&other):拷貝構(gòu)造 左值引用? 可取地址數(shù)組
- void?setArray(const QJsonArray &array):設(shè)置空QJsonDocument對象
- void?setObject(const QJsonObject &object):設(shè)置空QJsonDocument對象
- void?swap(QJsonDocument &other):交換兩個(gè)QJsonDocument對象
將QJsonDocument對象轉(zhuǎn)換為字符串QByteArray
QByteArray?toJson(QJsonDocument::JsonFormat format) const
- 創(chuàng)建一個(gè)QJsonObject,并添加了一些鍵值對。
- 我們使用toJson將QJsonObject轉(zhuǎn)換為QByteArray
- 我們將QByteArray轉(zhuǎn)換為std::string,并打印出來。
#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>QJsonObject jsonObject;
jsonObject["key1"] = "value1";
jsonObject["key2"] = 42;QJsonDocument jsonDocument(jsonObject);QByteArray byteArray = jsonDocument.toJson();
std::string jsonString = byteArray.toStdString();qDebug() << "JSON String:" << jsonString.c_str();
也可以將QByteArray轉(zhuǎn)換為QString,而不是std::string。例如,可以使用QString::fromUtf8()
函數(shù)將字節(jié)數(shù)組轉(zhuǎn)換為QString。
請注意,在使用QJsonDocument之前,你需要包含了#include <QJsonDocument>
頭文件,并鏈接到QtCore模塊。
2.5.2 字符串->QJsonArray和QJsonObject?
?將字符串QByteArray 轉(zhuǎn)換為QJsonDocument?對象
QJsonDocument?fromJson(const QByteArray &json, QJsonParseError *error = nullptr)//第一個(gè)參數(shù)傳入字符串,返回QJsonDocument 對象
- 創(chuàng)建一個(gè)包含JSON數(shù)據(jù)格式的字符串jsonString
- 將字符串轉(zhuǎn)換為QByteArray
- fromJson()將函數(shù)解析為QJsonDocument對象
- isObject()判斷是否為有效JSON對象,是則轉(zhuǎn)換為QJsonObject對象
- 通過鍵來獲取QJsonObject中的值。
#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>QString jsonString = "{\"key1\":\"value1\", \"key2\":42}";QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonString.toUtf8());if (!jsonDocument.isNull()) {if (jsonDocument.isObject()) {QJsonObject jsonObject = jsonDocument.object();QString value1 = jsonObject["key1"].toString();int value2 = jsonObject["key2"].toInt();qDebug() << "key1:" << value1;qDebug() << "key2:" << value2;}
}
3 Json文件操作的例子
3.1 主要運(yùn)用技術(shù)方法
- Json文件的序列化和反序列化
- QFile文件操作
- QJsonDocument、QJsonArray、QJsonObject、QJsonArray
?Json數(shù)據(jù)內(nèi)容
數(shù)據(jù)有三層嵌套,對象"{}"套對象"{}",對象"{}"套數(shù)組"[]"
//test.json
//Json描述一個(gè)人的信息:
{"NAME":"ACE","Sex":"man","Age":20,"Family":{"Father":"Babi","Mother":"MaMi","brother":["aa","bb","cc"]},"IsLive":"true","Comment":'yyds'
}
3.2? Json文件序列化:writeJson函數(shù)代碼實(shí)現(xiàn)
3.2.1 序列化
- 序列化 (Serialization)是將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程。對象的狀態(tài)(包括屬性、數(shù)據(jù))被轉(zhuǎn)換為字節(jié)流或其他表示形式,以便可以在不同的環(huán)境中傳輸、存儲或重建對象。序列化可以將對象轉(zhuǎn)換為平臺無關(guān)的格式,使得可以在不同的編程語言和平臺之間進(jìn)行對象的交互和傳輸。
此處的序列化指:將QJsonObject? 通過QJsonDocument轉(zhuǎn)換為? QByteArray(即文本格式字符串)? QJSonObject/QJsonArray===>字符串
- 序列化的主要目的有以下幾點(diǎn):
????????????????持久化對象:將對象保存到文件系統(tǒng)或數(shù)據(jù)庫中,以便在以后重新加載和使用。
????????????????對象傳輸:將對象通過網(wǎng)絡(luò)傳輸給其他系統(tǒng)或進(jìn)程。
????????????????遠(yuǎn)程過程調(diào)用(RPC):通過將對象序列化為消息,實(shí)現(xiàn)跨網(wǎng)絡(luò)調(diào)用遠(yuǎn)程方法。
????????????????對象復(fù)制:通過將對象序列化為字節(jié)流,實(shí)現(xiàn)對象的復(fù)制和克隆。
- 在序列化過程中,對象的狀態(tài)通常包括其屬性值、字段值和關(guān)聯(lián)的對象等信息。
- 一些常見的序列化格式包括JSON(JavaScript Object Notation)、XML(eXtensible Markup Language)、Protocol Buffers等。
3.2.2 QJsonArray或者QJsonObject===>字符串
- 創(chuàng)建QJsonDocument對象
QJsonDocument::QJsonDocument(const QJsonObject &object);
QJsonDocument::QJsonDocument(const QJsonArray &array);
通過構(gòu)造函數(shù)將示例化后的QJsonObject 或者 QJsonArray轉(zhuǎn)換為QJsonDocument對象?
- 將文件對象中的數(shù)據(jù)進(jìn)行序列化
QByteArray?QJsonDocument::toJson(QJsonDocument::JsonFormat format) const//文本格式
QByteArray? QJsonDocument::toBinaryData() const//二進(jìn)制格式
通過調(diào)用toXXX()方法可以將QJsonDocument對象轉(zhuǎn)換為文本格式或者二進(jìn)制格式的Json字符串?
- 使用得到的字符串進(jìn)行數(shù)據(jù)傳輸或者磁盤文件存儲
- writeJson函數(shù):?
void MainWindow::writeJson()
{//Json對象數(shù)據(jù)組織QJsonObject obj;obj.insert("name","ACE");obj.insert("sex","man");obj.insert("age",20);QJsonObject subObj;obj.insert("father","Babi");obj.insert("mother","Mami");QJsonArray array;array.append("aa");array.append("bb");array.append("cc");obj.insert("brother",array);obj.insert("family",subObj);obj.insert("islive","true");obj.insert("comment","yyds");//Json數(shù)據(jù)組織QJsonDocument doc(obj);//第一步 建立QJsonDocument對象QByteArray json = doc.toJson();//第二步 QJsonDocument對象的數(shù)據(jù)轉(zhuǎn)文本格式j(luò)son字符串QFile file("./test.json");//第三步 字符串存儲到計(jì)算機(jī)磁盤if(file.open(QFile::WriteOnly)){file.write(json);}file.close();
}
- 運(yùn)行后test.json結(jié)果:因?yàn)榘凑真I值排序,鍵值為英文字母所以? 排序是英文字母ASCII碼的排序。因此和輸入程序的順序明顯不同!使用QJsonObject會導(dǎo)致和程序輸入順序不同!!!
3.3?Json文件反序列化:readJson函數(shù)實(shí)現(xiàn)
3.3.1 反序列
- 反序列化(Deserialization)是將序列化后的數(shù)據(jù)轉(zhuǎn)換回原始對象的狀態(tài)的過程。
- 在計(jì)算機(jī)科學(xué)和軟件開發(fā)中,反序列化用于從序列化的表示形式中恢復(fù)對象的狀態(tài),以便能夠使用、操作和處理對象的數(shù)據(jù)。
- 在反序列化過程中,序列化的數(shù)據(jù)(如字節(jié)流、JSON字符串、XML文檔等)被解析和轉(zhuǎn)換為對象的狀態(tài),包括屬性、字段和關(guān)聯(lián)的對象等信息,可以將數(shù)據(jù)重新還原為原始的對象形式,以便進(jìn)一步使用和操作。
- 具體的反序列化過程取決于所使用的序列化格式和編程語言。常見的序列化格式如JSON、XML和Protocol Buffers都有相應(yīng)的反序列化機(jī)制。
3.3.2 字符串===>QJsonArray或者 QJsonObject
- 將得到的Json格式字符串通過QJsonDocument類的靜態(tài)函數(shù)轉(zhuǎn)換為QJsonDocument類對象
[static] QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = nullptr)//參數(shù)為文件格式的字符串
[static] QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, QJsonDocument::DataValidation validation = Validate)//參數(shù)為二進(jìn)制格式
- 將文本對象轉(zhuǎn)換為json數(shù)組/對象
//判斷文檔對象中存儲的數(shù)據(jù)是不是json數(shù)組
bool QJsonDocument::isArray() const
//判斷文檔對象中存儲的數(shù)據(jù)是不是json對象
bool QJsonDocument::isObject() const//文檔對象中的數(shù)據(jù)轉(zhuǎn)換為json對象
QJsonObject QJsonDocument::object() const
//文檔對象中的數(shù)據(jù)轉(zhuǎn)換為json數(shù)組
QJsonObject QJsonDocument::array() const
- 通過調(diào)用QJsonQrray或者QJsonObject類提供的API讀取存儲在對象中的數(shù)據(jù)?
- readJson函數(shù)實(shí)現(xiàn)
void MainWindow::readJson()
{QFile file("./test.json");if(file.open(QFile::ReadOnly)){QByteArray all = file.readAll();QJsonDocument doc = QJsonDocument::fromJson(all);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();}else if(value.isString()){qDebug()<<key<<":"<<value.toString();}else if(value.isDouble()){qDebug()<<key<<":"<<value.toInt();}else if(value.isObject()){qDebug()<<key<<":";QJsonObject subObj = value.toObject();QStringList subKeys = subObj.keys();for(int k=0;k<subKeys.size();++k){QJsonValue subValue = subObj.value(subKeys.at(k));if(subValue.isString()){qDebug()<<" "<<subKeys.at(k)<<":"<<subValue.toString();}else if(subValue.isArray()){qDebug()<<" "<<subKeys.at(k)<<":";QJsonArray array = subValue.toArray();for(int m=0;m<array.size();++m){qDebug()<<" "<<array[m].toString();}}}}}}}file.close();
}
3.4 整體代碼
3.4.1 mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void writeJson();void readJson();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
3.4.2 mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QJsonDocument>
#include<QJsonObject>
#include<QJsonArray>
#include<QJsonValue>
#include<QDebug>
#include<QFile>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QJsonDocument doc;if(doc.isEmpty()){qDebug()<<"Json document is empty...";}if(doc.isNull()){qDebug()<<"Json document is null...";}writeJson();readJson();
}MainWindow::~MainWindow()
{delete ui;
}/*
//test.json
//Json描述一個(gè)人的信息:
{"NAME":"ACE","Sex":"man","Age":20,"Family":{"Father":"Babi","Mother":"MaMi","brother":["aa","bb","cc"]},"IsLive":"true","Comment":'yyds'
}
*/
void MainWindow::writeJson()
{//Json對象數(shù)據(jù)組織QJsonObject obj;obj.insert("name","ACE");obj.insert("sex","man");obj.insert("age",20);QJsonObject subObj;subObj.insert("father","Babi");subObj.insert("mother","Mami");QJsonArray array;array.append("aa");array.append("bb");array.append("cc");subObj.insert("brother",array);obj.insert("family",subObj);obj.insert("islive","true");obj.insert("comment","yyds");//Json數(shù)據(jù)組織QJsonDocument doc(obj);QByteArray json = doc.toJson();//json數(shù)據(jù)轉(zhuǎn)文本格式字符串QFile file("./test.json");if(file.open(QFile::WriteOnly)){file.write(json);}file.close();
}void MainWindow::readJson()
{QFile file("./test.json");if(file.open(QFile::ReadOnly)){QByteArray all = file.readAll();QJsonDocument doc = QJsonDocument::fromJson(all);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();}else if(value.isString()){qDebug()<<key<<":"<<value.toString();}else if(value.isDouble()){qDebug()<<key<<":"<<value.toInt();}else if(value.isObject()){qDebug()<<key<<":";QJsonObject subObj = value.toObject();QStringList subKeys = subObj.keys();for(int k=0;k<subKeys.size();++k){QJsonValue subValue = subObj.value(subKeys.at(k));if(subValue.isString()){qDebug()<<" "<<subKeys.at(k)<<":"<<subValue.toString();}else if(subValue.isArray()){qDebug()<<" "<<subKeys.at(k)<<":";QJsonArray array = subValue.toArray();for(int m=0;m<array.size();++m){qDebug()<<" "<<array[m].toString();}}}}}}}file.close();
}