Qt中JSON使用的詳細步驟
一.前言:
JSON是一種輕量級數據交換格式,常用于客戶端和服務端的數據交互,不依賴于編程語言,在很多編程語言中都可以使用JSON,比如C,C++,Java,Android,Qt。除了JSON,還有一種數據傳輸格式XML,相較于XML,JSON更加便于閱讀和書寫。
JSON 有兩種數據格式:JSON對象和JSON數組。被中括號包裹的是JSON數組,被大括號包裹的是JSON對象。
二.JSON數組:
JSON數組的格式:[元素1,元素2,元素3,…]
示例1:元素可以是不同數據類型
[1,2,3.14,"hello world",true,null]
示例2:元素可以是JSON對象或JSON數組
[ { "id":123, "name":"tom" }, [1,2,3.14,"hello world",true,null] ]
三.JSON對象:
JSON對象的格式:一個或多個鍵值對組成
示例1:
{ "id":123, "name":"tom" }
示例2:嵌套JSON對象和JSON數組,JSON對象和JSON數組也要使用鍵值對格式
{ "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 }
小結:JSON數組里可以包含JSON對象或JSON數組,JSON對象里也可以嵌套JSON對象或JSON數組。
四.Qt中JSON的使用
1.生成JSON數據
2.解析JSON數據
在QT5.0版本以后支持對JSON的使用,QT5.0之前需要自己集成第三方庫。
1.生成JSON數據
要生成的JSON數據如下:
{ "name": "小王", "age": 30, "address": { "city": "北京", "street": "人民路32號" }, "phoneNumbers": [ { "number": "999-123456", "type": "家" }, { "number": "999-654321", "type": "公司" } ] }
使用Qt生成上面的JSON數據:
#include <QJsonObject> #include <QJsonArray> #include <QJsonDocument> #include <QDebug> void MainWindow::writeJSON() { // 創(chuàng)建最外層的 JSON 對象,里面包含要構建的所有 JSON 數據 QJsonObject rootObj; // 插入 name 鍵值對到 rootObj rootObj.insert("name","小王"); // 插入 age 鍵值對到 rootObj rootObj.insert("age",30); // 創(chuàng)建地址 JSON 對象,里面包含兩個鍵值對 QJsonObject addressObj; addressObj.insert("city","北京"); addressObj.insert("street","人民路32號"); // 插入地址 JSON 對象到 rootObj rootObj.insert("address",addressObj); // 創(chuàng)建電話 JSON 數組,里面包含兩個電話 JSON 對象 QJsonArray phoneArray; // 創(chuàng)建兩個電話 JSON 對象 QJsonObject phoneHomeObj; phoneHomeObj.insert("type","家"); phoneHomeObj.insert("number","999-123456"); QJsonObject phoneWorkObj; phoneWorkObj.insert("type","公司"); phoneWorkObj.insert("number","999-654321"); // 在電話 JSON 數組中添加兩個電話 JSON 對象 phoneArray.append(phoneHomeObj); phoneArray.append(phoneWorkObj); // 插入電話 JSON 數組到 rootObj rootObj.insert("phoneNumbers",phoneArray); // 將 rootObj JSON對象轉換為 JSON 數據格式 QJsonDocument doc(rootObj); QByteArray json = doc.toJson(); // 打印 qDebug()<<QString::fromUtf8(json); }
2.解析JSON數據
要解析的JSON數據如下,先將它放在test.json文本文件中:
{ "name": "小王", "age": 30, "address": { "city": "北京", "street": "人民路32號" }, "phoneNumbers": [ { "number": "999-123456", "type": "家" }, { "number": "999-654321", "type": "公司" } ] }
使用Qt解析上面的JSON數據:
#include <QJsonObject> #include <QJsonArray> #include <QJsonDocument> #include <QDebug> #include <QFile> void MainWindow::analyseJSON() { // 讀取文本中的 JSON 數據 QFile file("C:\\Users\\A\\Desktop\\temp\\test.json"); file.open(QFile::ReadOnly); QByteArray json = file.readAll(); file.close(); // 將 JSON 數據轉換為 QJsonDocument 對象 QJsonDocument doc = QJsonDocument::fromJson(json); if(!doc.isObject()) {// 不是 JSON 對象:JSON 字符串格式錯誤或無效 qDebug()<<"不是 JSON 對象:JSON 字符串格式錯誤或無效"; return; } // 將 QJsonDocument 對象中的 JSON 數據轉換為 JSON 對象 QJsonObject obj = doc.object(); // 獲取 JSON 數據中的所有鍵 QStringList keys = obj.keys(); // 遍歷鍵值對 for (int i = 0;i<keys.size();++i) { // 獲取每一個 key QString key = keys[i]; // 通過 key 獲取對應的 value QJsonValue value = obj.value(key); if(value.isBool()) {// 值是一個 bool qDebug()<<key<<":"<<value.toBool(); } else if(value.isString()) {// 值是一個字符串 qDebug()<<key<<":"<<value.toString(); } else if(value.isDouble()) {// 值是一個 double 或者 int(double 和 int 都用 isDouble) qDebug()<<key<<":"<<value.toInt(); } else if(value.isObject()) {// 值是一個 JSON 對象 qDebug()<<key<<":"; // 這里偷個懶,不再像上面那樣循環(huán)獲取值了,而是直接通過已知的鍵去獲取值 QJsonObject addressObj = value.toObject(); QString city = addressObj["city"].toString(); QString street = addressObj["street"].toString(); qDebug()<<" "<<"city:"<<city; qDebug()<<" "<<"street:"<<street; } else if (value.isArray()) {// 值是一個 JSON 數組 qDebug()<<key<<":"; QJsonArray phoneArray = value.toArray(); for (int i = 0;i<phoneArray.size();++i) {// 遍歷 JSON 數組中的每一個 JSON 對象 QJsonObject phoneObj = phoneArray[i].toObject(); QString number = phoneObj["number"].toString(); QString type = phoneObj["type"].toString(); qDebug()<<" "<<"number:"<<number; qDebug()<<" "<<"type:"<<type; } } } }
到此這篇關于Qt中JSON的使用的文章就介紹到這了,更多相關Qt JSON內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++中rapidjson將嵌套map轉為嵌套json的講解
今天小編就為大家分享一篇關于C++中rapidjson將嵌套map轉為嵌套json的講解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04C/C++中棧(stack)&堆(heap)詳解及其作用介紹
這篇文章主要介紹了C/C++中棧(stack)&堆(heap)詳解及其作用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09C++?Qt開發(fā)之使用QUdpSocket實現UDP網絡通信
Qt 是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應用程序,本文主要介紹如何運用QUdpSocket組件實現基于UDP的網絡通信功能,需要的可以參考下2024-03-03