Qt中JSON使用的詳細(xì)步驟
一.前言:
JSON是一種輕量級(jí)數(shù)據(jù)交換格式,常用于客戶端和服務(wù)端的數(shù)據(jù)交互,不依賴于編程語(yǔ)言,在很多編程語(yǔ)言中都可以使用JSON,比如C,C++,Java,Android,Qt。除了JSON,還有一種數(shù)據(jù)傳輸格式XML,相較于XML,JSON更加便于閱讀和書(shū)寫(xiě)。
JSON 有兩種數(shù)據(jù)格式:JSON對(duì)象和JSON數(shù)組。被中括號(hào)包裹的是JSON數(shù)組,被大括號(hào)包裹的是JSON對(duì)象。
二.JSON數(shù)組:
JSON數(shù)組的格式:[元素1,元素2,元素3,…]
示例1:元素可以是不同數(shù)據(jù)類型
[1,2,3.14,"hello world",true,null]
示例2:元素可以是JSON對(duì)象或JSON數(shù)組
[ { "id":123, "name":"tom" }, [1,2,3.14,"hello world",true,null] ]
三.JSON對(duì)象:
JSON對(duì)象的格式:一個(gè)或多個(gè)鍵值對(duì)組成
示例1:
{ "id":123, "name":"tom" }
示例2:嵌套JSON對(duì)象和JSON數(shù)組,JSON對(duì)象和JSON數(shù)組也要使用鍵值對(duì)格式
{ "name": "John Doe", "age": 30, "address": { "city": "New York", "street": "123 Main St" }, "phoneNumbers": [ { "type": "home", "number": "555-1234" }, { "type": "work", "number": "555-5678" } ], "hobbies": ["reading", "painting", "playing guitar"], "isStudent": true }
小結(jié):JSON數(shù)組里可以包含JSON對(duì)象或JSON數(shù)組,JSON對(duì)象里也可以嵌套JSON對(duì)象或JSON數(shù)組。
四.Qt中JSON的使用
1.生成JSON數(shù)據(jù)
2.解析JSON數(shù)據(jù)
在QT5.0版本以后支持對(duì)JSON的使用,QT5.0之前需要自己集成第三方庫(kù)。
1.生成JSON數(shù)據(jù)
要生成的JSON數(shù)據(jù)如下:
{ "name": "小王", "age": 30, "address": { "city": "北京", "street": "人民路32號(hào)" }, "phoneNumbers": [ { "number": "999-123456", "type": "家" }, { "number": "999-654321", "type": "公司" } ] }
使用Qt生成上面的JSON數(shù)據(jù):
#include <QJsonObject> #include <QJsonArray> #include <QJsonDocument> #include <QDebug> void MainWindow::writeJSON() { // 創(chuàng)建最外層的 JSON 對(duì)象,里面包含要構(gòu)建的所有 JSON 數(shù)據(jù) QJsonObject rootObj; // 插入 name 鍵值對(duì)到 rootObj rootObj.insert("name","小王"); // 插入 age 鍵值對(duì)到 rootObj rootObj.insert("age",30); // 創(chuàng)建地址 JSON 對(duì)象,里面包含兩個(gè)鍵值對(duì) QJsonObject addressObj; addressObj.insert("city","北京"); addressObj.insert("street","人民路32號(hào)"); // 插入地址 JSON 對(duì)象到 rootObj rootObj.insert("address",addressObj); // 創(chuàng)建電話 JSON 數(shù)組,里面包含兩個(gè)電話 JSON 對(duì)象 QJsonArray phoneArray; // 創(chuàng)建兩個(gè)電話 JSON 對(duì)象 QJsonObject phoneHomeObj; phoneHomeObj.insert("type","家"); phoneHomeObj.insert("number","999-123456"); QJsonObject phoneWorkObj; phoneWorkObj.insert("type","公司"); phoneWorkObj.insert("number","999-654321"); // 在電話 JSON 數(shù)組中添加兩個(gè)電話 JSON 對(duì)象 phoneArray.append(phoneHomeObj); phoneArray.append(phoneWorkObj); // 插入電話 JSON 數(shù)組到 rootObj rootObj.insert("phoneNumbers",phoneArray); // 將 rootObj JSON對(duì)象轉(zhuǎn)換為 JSON 數(shù)據(jù)格式 QJsonDocument doc(rootObj); QByteArray json = doc.toJson(); // 打印 qDebug()<<QString::fromUtf8(json); }
2.解析JSON數(shù)據(jù)
要解析的JSON數(shù)據(jù)如下,先將它放在test.json文本文件中:
{ "name": "小王", "age": 30, "address": { "city": "北京", "street": "人民路32號(hào)" }, "phoneNumbers": [ { "number": "999-123456", "type": "家" }, { "number": "999-654321", "type": "公司" } ] }
使用Qt解析上面的JSON數(shù)據(jù):
#include <QJsonObject> #include <QJsonArray> #include <QJsonDocument> #include <QDebug> #include <QFile> void MainWindow::analyseJSON() { // 讀取文本中的 JSON 數(shù)據(jù) QFile file("C:\\Users\\A\\Desktop\\temp\\test.json"); file.open(QFile::ReadOnly); QByteArray json = file.readAll(); file.close(); // 將 JSON 數(shù)據(jù)轉(zhuǎn)換為 QJsonDocument 對(duì)象 QJsonDocument doc = QJsonDocument::fromJson(json); if(!doc.isObject()) {// 不是 JSON 對(duì)象:JSON 字符串格式錯(cuò)誤或無(wú)效 qDebug()<<"不是 JSON 對(duì)象:JSON 字符串格式錯(cuò)誤或無(wú)效"; return; } // 將 QJsonDocument 對(duì)象中的 JSON 數(shù)據(jù)轉(zhuǎn)換為 JSON 對(duì)象 QJsonObject obj = doc.object(); // 獲取 JSON 數(shù)據(jù)中的所有鍵 QStringList keys = obj.keys(); // 遍歷鍵值對(duì) for (int i = 0;i<keys.size();++i) { // 獲取每一個(gè) key QString key = keys[i]; // 通過(guò) key 獲取對(duì)應(yīng)的 value QJsonValue value = obj.value(key); if(value.isBool()) {// 值是一個(gè) bool qDebug()<<key<<":"<<value.toBool(); } else if(value.isString()) {// 值是一個(gè)字符串 qDebug()<<key<<":"<<value.toString(); } else if(value.isDouble()) {// 值是一個(gè) double 或者 int(double 和 int 都用 isDouble) qDebug()<<key<<":"<<value.toInt(); } else if(value.isObject()) {// 值是一個(gè) JSON 對(duì)象 qDebug()<<key<<":"; // 這里偷個(gè)懶,不再像上面那樣循環(huán)獲取值了,而是直接通過(guò)已知的鍵去獲取值 QJsonObject addressObj = value.toObject(); QString city = addressObj["city"].toString(); QString street = addressObj["street"].toString(); qDebug()<<" "<<"city:"<<city; qDebug()<<" "<<"street:"<<street; } else if (value.isArray()) {// 值是一個(gè) JSON 數(shù)組 qDebug()<<key<<":"; QJsonArray phoneArray = value.toArray(); for (int i = 0;i<phoneArray.size();++i) {// 遍歷 JSON 數(shù)組中的每一個(gè) JSON 對(duì)象 QJsonObject phoneObj = phoneArray[i].toObject(); QString number = phoneObj["number"].toString(); QString type = phoneObj["type"].toString(); qDebug()<<" "<<"number:"<<number; qDebug()<<" "<<"type:"<<type; } } } }
到此這篇關(guān)于Qt中JSON的使用的文章就介紹到這了,更多相關(guān)Qt JSON內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中rapidjson將嵌套map轉(zhuǎn)為嵌套json的講解
今天小編就為大家分享一篇關(guān)于C++中rapidjson將嵌套map轉(zhuǎn)為嵌套json的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04C/C++中棧(stack)&堆(heap)詳解及其作用介紹
這篇文章主要介紹了C/C++中棧(stack)&堆(heap)詳解及其作用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09c++ 子類構(gòu)造函數(shù)初始化及父類構(gòu)造初始化的使用
這篇文章主要介紹了c++ 子類構(gòu)造函數(shù)初始化及父類構(gòu)造初始化的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07C++?Qt開(kāi)發(fā)之使用QUdpSocket實(shí)現(xiàn)UDP網(wǎng)絡(luò)通信
Qt 是一個(gè)跨平臺(tái)C++圖形界面開(kāi)發(fā)庫(kù),利用Qt可以快速開(kāi)發(fā)跨平臺(tái)窗體應(yīng)用程序,本文主要介紹如何運(yùn)用QUdpSocket組件實(shí)現(xiàn)基于UDP的網(wǎng)絡(luò)通信功能,需要的可以參考下2024-03-03C++實(shí)現(xiàn)學(xué)校運(yùn)動(dòng)會(huì)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)學(xué)校運(yùn)動(dòng)會(huì)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10利用C++模擬實(shí)現(xiàn)STL容器:list
列表是一種順序容器,它允許在序列中的任何位置執(zhí)行常量時(shí)間插入和刪除操作,并允許在兩個(gè)方向上進(jìn)行迭代。本文將利用C++模擬實(shí)現(xiàn)list,希望對(duì)大家有所幫助2022-12-12