簡(jiǎn)述
Qt5 中包含了處理 JSON 的類(lèi),均以 QJson 開(kāi)頭(例如:QJsonDocument、QJsonArray、QJsonObject),在 QtCore 模塊中,不需要額外引入其它模塊。
簡(jiǎn)述常用的 JSON 庫(kù)JSON 常用類(lèi)簡(jiǎn)單的 JSON 對(duì)象簡(jiǎn)單的 JSON 數(shù)組復(fù)雜的 JSON更多參考常用的 JSON 庫(kù)
json.org?中介紹了 JSON 在各種語(yǔ)言中的應(yīng)用,在 C/C++ 中比較常用的JSON 庫(kù)主要有以下幾個(gè):
JsonCpp?
JsonCpp 是一個(gè) C++ 用來(lái)處理 JSON 數(shù)據(jù)的開(kāi)發(fā)包。?
網(wǎng)址:http://jsoncpp.sourceforge.net/
cJSON?
cJSON 是一個(gè)超輕巧,攜帶方便,單文件,簡(jiǎn)單的可以作為 ANSI-C 標(biāo)準(zhǔn)的 JSON 解析器。?
網(wǎng)址:http://sourceforge.net/projects/cjson/
QJson?
QJson 是一個(gè)基于 Qt 的開(kāi)發(fā)包用來(lái)將 JSON 數(shù)據(jù)解析成 QVariant 對(duì)象,JSON 的數(shù)組將被映射為QVariantList 實(shí)例,而其他對(duì)象映射為 QVariantMap 實(shí)例。?
網(wǎng)址:http://qjson.sourceforge.net/
關(guān)于 Qt 中對(duì) JSON 的生成與解析,Qt5 以前的版本,可以使用 QJson 庫(kù),需要單獨(dú)下載、編譯,才能使用。到了 Qt5,提供了專(zhuān)門(mén)的 QJsonDocument 及其相關(guān)類(lèi)來(lái)讀和寫(xiě) JSON 文檔。
JSON 常用類(lèi)
QJsonDocument
QJsonDocument 類(lèi)用于讀和寫(xiě) JSON 文檔。
一個(gè) JSON 文檔可以使用 QJsonDocument::fromJson() 從基于文本的表示轉(zhuǎn)化為 QJsonDocument, toJson() 則可以反向轉(zhuǎn)化為文本。解析器非??烨腋咝?,并將 JSON 轉(zhuǎn)換為 Qt 使用的二進(jìn)制表示。
已解析文檔的有效性,可以使用 !isNull() 進(jìn)行查詢(xún)。
如果要查詢(xún)一個(gè) JSON 文檔是否包含一個(gè)數(shù)組或一個(gè)對(duì)象,使用 isArray() 和 isObject()。包含在文檔中的數(shù)組或?qū)ο罂梢允褂?array() 或 object() 檢索,然后讀取或操作。
也可以使用 fromBinaryData() 或 fromRawData() 從存儲(chǔ)的二進(jìn)制表示創(chuàng)建來(lái) JSON 文檔。
QJsonArray
QJsonArray 類(lèi)封裝了一個(gè) JSON 數(shù)組。
JSON 數(shù)組是值的列表。列表可以被操作,通過(guò)從數(shù)組中插入和刪除 QJsonValue 。
一個(gè) QJsonArray 可以和一個(gè) QVariantList 相互轉(zhuǎn)換。可以使用 size() 來(lái)查詢(xún)條目的數(shù)量,通過(guò) insert() 在指定索引處插入值,removeAt() 來(lái)刪除指定索引的值。
QJsonObject
QJsonObject 類(lèi)封裝了一個(gè) JSON 對(duì)象。
一個(gè) JSON 對(duì)象是一個(gè)“key/value 對(duì)”列表,key 是獨(dú)一無(wú)二的字符串,value 由一個(gè) QJsonValue 表示。
一個(gè) QJsonObject 可以和一個(gè) QVariantMap 相互轉(zhuǎn)換??梢允褂?size() 來(lái)查詢(xún)“key/value 對(duì)”的數(shù)量,通過(guò) insert() 插入“key/value 對(duì)”, remove() 刪除指定的 key。
QJsonValue
QJsonValue 類(lèi)封裝了一個(gè)值。
JSON 中的值有 6 種基本數(shù)據(jù)類(lèi)型:
bool(QJsonValue::Bool)double(QJsonValue::Double)string(QJsonValue::String)array(QJsonValue::Array)object(QJsonValue::Object)null(QJsonValue::Null)
一個(gè)值可以由任何上述數(shù)據(jù)類(lèi)型表示。此外,QJsonValue 有一個(gè)特殊的標(biāo)記來(lái)表示未定義的值,可以使用 isUndefined() 查詢(xún)。
值的類(lèi)型可以通過(guò) type() 或 isBool()、isString() 等訪(fǎng)問(wèn)函數(shù)查詢(xún)。同樣地,值可以通過(guò) toBool()、toString() 等函數(shù)轉(zhuǎn)化成相應(yīng)的存儲(chǔ)類(lèi)型。
QJsonParseError
QJsonParseError 類(lèi)用于在 JSON 解析中報(bào)告錯(cuò)誤。
枚舉 QJsonParseError::ParseError:
該枚舉描述 JSON 文檔在解析過(guò)程中所發(fā)生的錯(cuò)誤類(lèi)型。
QJsonParseError::NoError0未發(fā)生錯(cuò)誤QJsonParseError::UnterminatedObject1對(duì)象不正確地終止以右花括號(hào)結(jié)束QJsonParseError::MissingNameSeparator2分隔不同項(xiàng)的逗號(hào)丟失QJsonParseError::UnterminatedArray3數(shù)組不正確地終止以右中括號(hào)結(jié)束QJsonParseError::MissingValueSeparator4對(duì)象中分割 key/value 的冒號(hào)丟失QJsonParseError::IllegalValue5值是非法的QJsonParseError::TerminationByNumber6在解析數(shù)字時(shí),輸入流結(jié)束QJsonParseError::IllegalNumber7數(shù)字格式不正確QJsonParseError::IllegalEscapeSequence8在輸入時(shí),發(fā)生一個(gè)非法轉(zhuǎn)義序列QJsonParseError::IllegalUTF8String9在輸入時(shí),發(fā)生一個(gè)非法 UTF8 序列QJsonParseError::UnterminatedString10字符串不是以引號(hào)結(jié)束QJsonParseError::MissingObject11一個(gè)對(duì)象是預(yù)期的,但是不能被發(fā)現(xiàn)QJsonParseError::DeepNesting12對(duì)解析器來(lái)說(shuō),JSON 文檔嵌套太深QJsonParseError::DocumentTooLarge13對(duì)解析器來(lái)說(shuō),JSON 文檔太大QJsonParseError::GarbageAtEnd14解析的文檔在末尾處包含額外的亂碼簡(jiǎn)單的 JSON 對(duì)象
構(gòu)造一個(gè)簡(jiǎn)單的 JSON 對(duì)象:
{ ????"Cross?Platform":?true, ????"From":?1991, ????"Name":?"Qt" }
生成比較簡(jiǎn)單,由于是一個(gè)對(duì)象,只需要用 QJsonObject 即可。
//?構(gòu)建?JSON?對(duì)象 QJsonObject?json; json.insert("Name",?"Qt"); json.insert("From",?1991); json.insert("Cross?Platform",?true); //?構(gòu)建?JSON?文檔 QJsonDocument?document; document.setObject(json); QByteArray?byteArray?=?document.toJson(QJsonDocument::Compact); QString?strJson(byteArray); qDebug()?<<?strJson;
解析如下:
QJsonParseError?jsonError; QJsonDocument?doucment?=?QJsonDocument::fromJson(byteArray,?&jsonError);??//?轉(zhuǎn)化為?JSON?文檔 if?(!doucment.isNull()?&&?(jsonError.error?==?QJsonParseError::NoError))?{??//?解析未發(fā)生錯(cuò)誤 ????if?(doucment.isObject())?{?//?JSON?文檔為對(duì)象 ????????QJsonObject?object?=?doucment.object();??//?轉(zhuǎn)化為對(duì)象 ????????if?(object.contains("Name"))?{??//?包含指定的?key ????????????QJsonValue?value?=?object.value("Name");??//?獲取指定?key?對(duì)應(yīng)的?value ????????????if?(value.isString())?{??//?判斷?value?是否為字符串 ????????????????QString?strName?=?value.toString();??//?將?value?轉(zhuǎn)化為字符串 ????????????????qDebug()?<<?"Name?:?"?<<?strName; ????????????} ????????} ????????if?(object.contains("From"))?{ ????????????QJsonValue?value?=?object.value("From"); ????????????if?(value.isDouble())?{ ????????????????int?nFrom?=?value.toVariant().toInt(); ????????????????qDebug()?<<?"From?:?"?<<?nFrom; ????????????} ????????} ????????if?(object.contains("Cross?Platform"))?{ ????????????QJsonValue?value?=?object.value("Cross?Platform"); ????????????if?(value.isBool())?{ ????????????????bool?bCrossPlatform?=?value.toBool(); ????????????????qDebug()?<<?"CrossPlatform?:?"?<<?bCrossPlatform; ????????????} ????????} ????} }
注意:在轉(zhuǎn)化為 QJsonDocument 后,首先需要根據(jù) QJsonParseError 的值判定是否轉(zhuǎn)化成功,然后在進(jìn)行相應(yīng)的轉(zhuǎn)化解析。
簡(jiǎn)單的 JSON 數(shù)組
構(gòu)造一個(gè)簡(jiǎn)單的 JSON 對(duì)象:
[ ????"Qt", ????5.7, ????true ]
生成比較簡(jiǎn)單,由于是一個(gè)數(shù)組,只需要用 QJsonArray 即可。
//?構(gòu)建?JSON?數(shù)組 QJsonArray?json; json.append("Qt"); json.append(5.7); json.append(true); //?構(gòu)建?JSON?文檔 QJsonDocument?document; document.setArray(json); QByteArray?byteArray?=?document.toJson(QJsonDocument::Compact); QString?strJson(byteArray); qDebug()?<<?strJson;
需要注意的是,和上面不同的是,這里使用的是 QJsonDocument 的 setArray() 函數(shù),因?yàn)槭菙?shù)組嘛!
解析如下:
QJsonParseError?jsonError; QJsonDocument?doucment?=?QJsonDocument::fromJson(byteArray,?&jsonError);??//?轉(zhuǎn)化為?JSON?文檔 if?(!doucment.isNull()?&&?(jsonError.error?==?QJsonParseError::NoError))?{?//?解析未發(fā)生錯(cuò)誤 ????if?(doucment.isArray())?{?//?JSON?文檔為數(shù)組 ????????QJsonArray?array?=?doucment.array();??//?轉(zhuǎn)化為數(shù)組 ????????int?nSize?=?array.size();??//?獲取數(shù)組大小 ????????for?(int?i?=?0;?i?<?nSize;?++i)?{??//?遍歷數(shù)組 ????????????QJsonValue?value?=?array.at(i); ????????????if?(value.type()?==?QJsonValue::String)?{ ????????????????QString?strName?=?value.toString(); ????????????????qDebug()?<<?strName; ????????????} ????????????if?(value.type()?==?QJsonValue::Double)?{ ????????????????double?dVersion?=?value.toDouble(); ????????????????qDebug()?<<?dVersion; ????????????} ????????????if?(value.type()?==?QJsonValue::Bool)?{ ????????????????bool?bCrossPlatform??=?value.toBool(); ????????????????qDebug()?<<?bCrossPlatform; ????????????} ????????} ????} }
和 JSON 對(duì)象類(lèi)似,在遍歷數(shù)組時(shí),獲取每個(gè) value,首先需要判斷 value 的類(lèi)型(和 is***() 函數(shù)類(lèi)似,這里根據(jù) type() 函數(shù)返回的枚舉值來(lái)判斷),然后再進(jìn)行相應(yīng)的轉(zhuǎn)換。
復(fù)雜的 JSON
構(gòu)造一個(gè)復(fù)雜的 JSON 對(duì)象:
{ ????"Company":?"Digia", ????"From":?1991, ????"Name":?"Qt", ????"Page":?{ ????????"Developers":?"https://www.qt.io/developers/", ????????"Download":?"https://www.qt.io/download/", ????????"Home":?"https://www.qt.io/" ????}, ????"Version":?[ ????????4.8, ????????5.2, ????????5.7 ????] }
包含了一個(gè)擁有五個(gè)“key/value 對(duì)”的對(duì)象,values 中的兩個(gè)(Company、Name)是字符串,一個(gè)(From)是數(shù)字,一個(gè)(Page)是對(duì)象,一個(gè)(Version)是數(shù)組。
要生成這樣一個(gè)復(fù)雜的 JSON 文檔,需要分別構(gòu)造對(duì)象和數(shù)組,然后將它們拼接起來(lái):
//?構(gòu)建?Json?數(shù)組?-?Version QJsonArray?versionArray; versionArray.append(4.8); versionArray.append(5.2); versionArray.append(5.7); //?構(gòu)建?Json?對(duì)象?-?Page QJsonObject?pageObject; pageObject.insert("Home",?"https://www.qt.io/"); pageObject.insert("Download",?"https://www.qt.io/download/"); pageObject.insert("Developers",?"https://www.qt.io/developers/"); //?構(gòu)建?Json?對(duì)象 QJsonObject?json; json.insert("Name",?"Qt"); json.insert("Company",?"Digia"); json.insert("From",?1991); json.insert("Version",?QJsonValue(versionArray)); json.insert("Page",?QJsonValue(pageObject)); //?構(gòu)建?Json?文檔 QJsonDocument?document; document.setObject(json); QByteArray?byteArray?=?document.toJson(QJsonDocument::Compact); QString?strJson(byteArray); qDebug()?<<?strJson;
解析部分其實(shí)并沒(méi)有看起來(lái)這么復(fù)雜,只要一步步搞明白對(duì)應(yīng)的類(lèi)型,然后進(jìn)行相應(yīng)轉(zhuǎn)化即可。
QJsonParseError?jsonError; QJsonDocument?doucment?=?QJsonDocument::fromJson(byteArray,?&jsonError);??//?轉(zhuǎn)化為?JSON?文檔 if?(!doucment.isNull()?&&?(jsonError.error?==?QJsonParseError::NoError))?{??//?解析未發(fā)生錯(cuò)誤 ????if?(doucment.isObject())?{??//?JSON?文檔為對(duì)象 ????????QJsonObject?object?=?doucment.object();??//?轉(zhuǎn)化為對(duì)象 ????????if?(object.contains("Name"))?{ ????????????QJsonValue?value?=?object.value("Name"); ????????????if?(value.isString())?{ ????????????????QString?strName?=?value.toString(); ????????????????qDebug()?<<?"Name?:?"?<<?strName; ????????????} ????????} ????????if?(object.contains("Company"))?{ ????????????QJsonValue?value?=?object.value("Company"); ????????????if?(value.isString())?{ ????????????????QString?strCompany?=?value.toString(); ????????????????qDebug()?<<?"Company?:?"?<<?strCompany; ????????????} ????????} ????????if?(object.contains("From"))?{ ????????????QJsonValue?value?=?object.value("From"); ????????????if?(value.isDouble())?{ ????????????????int?nFrom?=?value.toVariant().toInt(); ????????????????qDebug()?<<?"From?:?"?<<?nFrom; ????????????} ????????} ????????if?(object.contains("Version"))?{ ????????????QJsonValue?value?=?object.value("Version"); ????????????if?(value.isArray())?{??//?Version?的?value?是數(shù)組 ????????????????QJsonArray?array?=?value.toArray(); ????????????????int?nSize?=?array.size(); ????????????????for?(int?i?=?0;?i?<?nSize;?++i)?{ ????????????????????QJsonValue?value?=?array.at(i); ????????????????????if?(value.isDouble())?{ ????????????????????????double?dVersion?=?value.toDouble(); ????????????????????????qDebug()?<<?"Version?:?"?<<?dVersion; ????????????????????} ????????????????} ????????????} ????????} ????????if?(object.contains("Page"))?{ ????????????QJsonValue?value?=?object.value("Page"); ????????????if?(value.isObject())?{??//?Page?的?value?是對(duì)象 ????????????????QJsonObject?obj?=?value.toObject(); ????????????????if?(obj.contains("Home"))?{ ????????????????????QJsonValue?value?=?obj.value("Home"); ????????????????????if?(value.isString())?{ ????????????????????????QString?strHome?=?value.toString(); ????????????????????????qDebug()?<<?"Home?:?"?<<?strHome; ????????????????????} ????????????????} ????????????????if?(obj.contains("Download"))?{ ????????????????????QJsonValue?value?=?obj.value("Download"); ????????????????????if?(value.isString())?{ ????????????????????????QString?strDownload?=?value.toString(); ????????????????????????qDebug()?<<?"Download?:?"?<<?strDownload; ????????????????????} ????????????????} ????????????????if?(obj.contains("Developers"))?{ ????????????????????QJsonValue?value?=?obj.value("Developers"); ????????????????????if?(value.isString())?{ ????????????????????????QString?strDevelopers?=?value.toString(); ????????????????????????qDebug()?<<?"Developers?:?"?<<?strDevelopers; ????????????????????} ????????????????} ????????????} ????????} ????} }
基本的用法就這些,比較簡(jiǎn)單,細(xì)節(jié)很關(guān)鍵,建議在處理的過(guò)程中啟用嚴(yán)格模式,例如:先通過(guò) QJsonParseError::NoError 判斷轉(zhuǎn)化 JSON 文檔無(wú)誤,再進(jìn)行解析。在解析過(guò)程中,先判斷 QJsonValue 是否為對(duì)應(yīng)的類(lèi)型如 isObject(),再通過(guò) toObject() 轉(zhuǎn)化。
更多參考JavaScript Programming LanguageStandard ECMA-262 3rd Edition - December 1999json.orgRFC-4627Qt之JSONQt之JSON保存與讀取簡(jiǎn)述
Qt5 中包含了處理 JSON 的類(lèi),均以 QJson 開(kāi)頭(例如:QJsonDocument、QJsonArray、QJsonObject),在 QtCore 模塊中,不需要額外引入其它模塊。
簡(jiǎn)述常用的 JSON 庫(kù)JSON 常用類(lèi)簡(jiǎn)單的 JSON 對(duì)象簡(jiǎn)單的 JSON 數(shù)組復(fù)雜的 JSON更多參考常用的 JSON 庫(kù)
json.org?中介紹了 JSON 在各種語(yǔ)言中的應(yīng)用,在 C/C++ 中比較常用的JSON 庫(kù)主要有以下幾個(gè):
JsonCpp?
JsonCpp 是一個(gè) C++ 用來(lái)處理 JSON 數(shù)據(jù)的開(kāi)發(fā)包。?
網(wǎng)址:http://jsoncpp.sourceforge.net/
cJSON?
cJSON 是一個(gè)超輕巧,攜帶方便,單文件,簡(jiǎn)單的可以作為 ANSI-C 標(biāo)準(zhǔn)的 JSON 解析器。?
網(wǎng)址:http://sourceforge.net/projects/cjson/
QJson?
QJson 是一個(gè)基于 Qt 的開(kāi)發(fā)包用來(lái)將 JSON 數(shù)據(jù)解析成 QVariant 對(duì)象,JSON 的數(shù)組將被映射為QVariantList 實(shí)例,而其他對(duì)象映射為 QVariantMap 實(shí)例。?
網(wǎng)址:http://qjson.sourceforge.net/
關(guān)于 Qt 中對(duì) JSON 的生成與解析,Qt5 以前的版本,可以使用 QJson 庫(kù),需要單獨(dú)下載、編譯,才能使用。到了 Qt5,提供了專(zhuān)門(mén)的 QJsonDocument 及其相關(guān)類(lèi)來(lái)讀和寫(xiě) JSON 文檔。
JSON 常用類(lèi)
QJsonDocument
QJsonDocument 類(lèi)用于讀和寫(xiě) JSON 文檔。
一個(gè) JSON 文檔可以使用 QJsonDocument::fromJson() 從基于文本的表示轉(zhuǎn)化為 QJsonDocument, toJson() 則可以反向轉(zhuǎn)化為文本。解析器非??烨腋咝В?JSON 轉(zhuǎn)換為 Qt 使用的二進(jìn)制表示。
已解析文檔的有效性,可以使用 !isNull() 進(jìn)行查詢(xún)。
如果要查詢(xún)一個(gè) JSON 文檔是否包含一個(gè)數(shù)組或一個(gè)對(duì)象,使用 isArray() 和 isObject()。包含在文檔中的數(shù)組或?qū)ο罂梢允褂?array() 或 object() 檢索,然后讀取或操作。
也可以使用 fromBinaryData() 或 fromRawData() 從存儲(chǔ)的二進(jìn)制表示創(chuàng)建來(lái) JSON 文檔。
QJsonArray
QJsonArray 類(lèi)封裝了一個(gè) JSON 數(shù)組。
JSON 數(shù)組是值的列表。列表可以被操作,通過(guò)從數(shù)組中插入和刪除 QJsonValue 。
一個(gè) QJsonArray 可以和一個(gè) QVariantList 相互轉(zhuǎn)換。可以使用 size() 來(lái)查詢(xún)條目的數(shù)量,通過(guò) insert() 在指定索引處插入值,removeAt() 來(lái)刪除指定索引的值。
QJsonObject
QJsonObject 類(lèi)封裝了一個(gè) JSON 對(duì)象。
一個(gè) JSON 對(duì)象是一個(gè)“key/value 對(duì)”列表,key 是獨(dú)一無(wú)二的字符串,value 由一個(gè) QJsonValue 表示。
一個(gè) QJsonObject 可以和一個(gè) QVariantMap 相互轉(zhuǎn)換。可以使用 size() 來(lái)查詢(xún)“key/value 對(duì)”的數(shù)量,通過(guò) insert() 插入“key/value 對(duì)”, remove() 刪除指定的 key。
QJsonValue
QJsonValue 類(lèi)封裝了一個(gè)值。
JSON 中的值有 6 種基本數(shù)據(jù)類(lèi)型:
bool(QJsonValue::Bool)double(QJsonValue::Double)string(QJsonValue::String)array(QJsonValue::Array)object(QJsonValue::Object)null(QJsonValue::Null)
一個(gè)值可以由任何上述數(shù)據(jù)類(lèi)型表示。此外,QJsonValue 有一個(gè)特殊的標(biāo)記來(lái)表示未定義的值,可以使用 isUndefined() 查詢(xún)。
值的類(lèi)型可以通過(guò) type() 或 isBool()、isString() 等訪(fǎng)問(wèn)函數(shù)查詢(xún)。同樣地,值可以通過(guò) toBool()、toString() 等函數(shù)轉(zhuǎn)化成相應(yīng)的存儲(chǔ)類(lèi)型。
QJsonParseError
QJsonParseError 類(lèi)用于在 JSON 解析中報(bào)告錯(cuò)誤。
枚舉 QJsonParseError::ParseError:
該枚舉描述 JSON 文檔在解析過(guò)程中所發(fā)生的錯(cuò)誤類(lèi)型。
QJsonParseError::NoError0未發(fā)生錯(cuò)誤QJsonParseError::UnterminatedObject1對(duì)象不正確地終止以右花括號(hào)結(jié)束QJsonParseError::MissingNameSeparator2分隔不同項(xiàng)的逗號(hào)丟失QJsonParseError::UnterminatedArray3數(shù)組不正確地終止以右中括號(hào)結(jié)束QJsonParseError::MissingValueSeparator4對(duì)象中分割 key/value 的冒號(hào)丟失QJsonParseError::IllegalValue5值是非法的QJsonParseError::TerminationByNumber6在解析數(shù)字時(shí),輸入流結(jié)束QJsonParseError::IllegalNumber7數(shù)字格式不正確QJsonParseError::IllegalEscapeSequence8在輸入時(shí),發(fā)生一個(gè)非法轉(zhuǎn)義序列QJsonParseError::IllegalUTF8String9在輸入時(shí),發(fā)生一個(gè)非法 UTF8 序列QJsonParseError::UnterminatedString10字符串不是以引號(hào)結(jié)束QJsonParseError::MissingObject11一個(gè)對(duì)象是預(yù)期的,但是不能被發(fā)現(xiàn)QJsonParseError::DeepNesting12對(duì)解析器來(lái)說(shuō),JSON 文檔嵌套太深QJsonParseError::DocumentTooLarge13對(duì)解析器來(lái)說(shuō),JSON 文檔太大QJsonParseError::GarbageAtEnd14解析的文檔在末尾處包含額外的亂碼簡(jiǎn)單的 JSON 對(duì)象
構(gòu)造一個(gè)簡(jiǎn)單的 JSON 對(duì)象:
{ ????"Cross?Platform":?true, ????"From":?1991, ????"Name":?"Qt" }
生成比較簡(jiǎn)單,由于是一個(gè)對(duì)象,只需要用 QJsonObject 即可。
//?構(gòu)建?JSON?對(duì)象 QJsonObject?json; json.insert("Name",?"Qt"); json.insert("From",?1991); json.insert("Cross?Platform",?true); //?構(gòu)建?JSON?文檔 QJsonDocument?document; document.setObject(json); QByteArray?byteArray?=?document.toJson(QJsonDocument::Compact); QString?strJson(byteArray); qDebug()?<<?strJson;
解析如下:
QJsonParseError?jsonError; QJsonDocument?doucment?=?QJsonDocument::fromJson(byteArray,?&jsonError);??//?轉(zhuǎn)化為?JSON?文檔 if?(!doucment.isNull()?&&?(jsonError.error?==?QJsonParseError::NoError))?{??//?解析未發(fā)生錯(cuò)誤 ????if?(doucment.isObject())?{?//?JSON?文檔為對(duì)象 ????????QJsonObject?object?=?doucment.object();??//?轉(zhuǎn)化為對(duì)象 ????????if?(object.contains("Name"))?{??//?包含指定的?key ????????????QJsonValue?value?=?object.value("Name");??//?獲取指定?key?對(duì)應(yīng)的?value ????????????if?(value.isString())?{??//?判斷?value?是否為字符串 ????????????????QString?strName?=?value.toString();??//?將?value?轉(zhuǎn)化為字符串 ????????????????qDebug()?<<?"Name?:?"?<<?strName; ????????????} ????????} ????????if?(object.contains("From"))?{ ????????????QJsonValue?value?=?object.value("From"); ????????????if?(value.isDouble())?{ ????????????????int?nFrom?=?value.toVariant().toInt(); ????????????????qDebug()?<<?"From?:?"?<<?nFrom; ????????????} ????????} ????????if?(object.contains("Cross?Platform"))?{ ????????????QJsonValue?value?=?object.value("Cross?Platform"); ????????????if?(value.isBool())?{ ????????????????bool?bCrossPlatform?=?value.toBool(); ????????????????qDebug()?<<?"CrossPlatform?:?"?<<?bCrossPlatform; ????????????} ????????} ????} }
注意:在轉(zhuǎn)化為 QJsonDocument 后,首先需要根據(jù) QJsonParseError 的值判定是否轉(zhuǎn)化成功,然后在進(jìn)行相應(yīng)的轉(zhuǎn)化解析。
簡(jiǎn)單的 JSON 數(shù)組
構(gòu)造一個(gè)簡(jiǎn)單的 JSON 對(duì)象:
[ ????"Qt", ????5.7, ????true ]
<p style="font-family:'-apple-system
常量 | 值 | 描述 |
---|---|---|
常量 | 值 | 描述 |