Qt Json詳細介紹

一.概念介紹

JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,常用于前后端數據傳輸和存儲。它具有以下特點:

  1. 易讀性:JSON 使用人類可讀的文本格式表示數據,采用鍵值對的方式組織數據,易于閱讀和編輯。

  2. 輕量級:JSON 數據格式較為簡潔,不包含冗余信息,適合網絡傳輸和存儲。

  3. 自描述性:JSON 數據的結構清晰明了,鍵值對以及數組的嵌套結構能夠清晰地表示復雜數據。

  4. 易于解析:JSON 數據可以方便地被解析成多種編程語言中的數據結構,如對象、數組等。

  5. 跨平臺兼容:由于 JSON 是一種文本格式,不依賴特定的編程語言,能夠被多種編程語言解析和生成。

JSON 數據通常由對象(Object)和數組(Array)組成:

  • 對象(Object):由一組鍵值對構成,使用大括號 {} 表示。示例:{“name”: “Alice”, “age”: 30}
  • 數組(Array):由一組值構成,使用中括號 [] 表示。數組中的元素可以是對象、數組或基本數據類型。示例:[“apple”, “banana”, “cherry”]

總之,JSON 是一種簡單、輕量級、易讀的數據交換格式,被廣泛應用于 Web 開發、API 設計和數據交換等領域。通過了解 JSON 的基本概念和語法規則,可以更好地進行數據交互與處理。

二.重要的部分介紹

1. QJsonDocument:

  • QJsonDocument 類用于表示整個 JSON 文檔,可以包含一個 JSON 對象或一個 JSON 數組。
  • 可以使用該類來創建、讀取、寫入和操作 JSON 數據。
  • 成員函數:toJson() 將 JSON 文檔轉換為字符串,fromJson() 從字符串中解析 JSON 數據。

示例代碼如下:

#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 創建 JSON 對象QJsonObject personObject;personObject["name"] = "Alice";personObject["age"] = 30;personObject["isStudent"] = true;QJsonArray fruitsArray = {"apple", "banana", "cherry"};personObject["favoriteFruits"] = fruitsArray;QJsonObject addressObject;addressObject["city"] = "New York";addressObject["zipcode"] = "10001";personObject["address"] = addressObject;// 將 JSON 對象轉換為 JSON 文檔QJsonDocument jsonDocument(personObject);// 將 JSON 文檔轉換為 JSON 字符串QString jsonString = jsonDocument.toJson();qDebug() << "Generated JSON string:" << jsonString;// 解析 JSON 字符串為 JSON 文檔QJsonDocument parsedDocument = QJsonDocument::fromJson(jsonString.toUtf8());if (!parsedDocument.isNull() && parsedDocument.isObject()) {QJsonObject parsedObject = parsedDocument.object();QString name = parsedObject["name"].toString();int age = parsedObject["age"].toInt();bool isStudent = parsedObject["isStudent"].toBool();qDebug() << "Parsed name:" << name;qDebug() << "Parsed age:" << age;qDebug() << "Parsed isStudent:" << isStudent;} else {qDebug() << "Failed to parse JSON";}return a.exec();
}

2.QJsonObject(這和map很相似)

  • QJsonObject 類用于表示 JSON 對象,它是鍵值對的集合,其中鍵為字符串,值可以是字符串、整數、布爾值、對象或數組。
  • 可以通過下標操作符 [] 或 insert() 方法來添加鍵值對。
  • 成員函數:value() 可以獲取指定鍵對應的值,contains() 用于檢查是否包含指定鍵。

示例代碼如下:

#include <QCoreApplication>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 創建一個空的 JSON 對象QJsonObject personObject;// 添加鍵值對到 JSON 對象personObject["name"] = "Alice";personObject["age"] = 30;personObject["isStudent"] = true;// 創建包含一組值的 JSON 數組QJsonArray fruitsArray = {"apple", "banana", "cherry"};personObject["favoriteFruits"] = fruitsArray;// 創建一個嵌套的 JSON 對象QJsonObject addressObject;addressObject["city"] = "New York";addressObject["zipcode"] = "10001";personObject["address"] = addressObject;// 訪問和輸出 JSON 對象中的值qDebug() << "Name:" << personObject["name"].toString();qDebug() << "Age:" << personObject["age"].toInt();qDebug() << "Is Student:" << personObject["isStudent"].toBool();// 訪問嵌套的 JSON 對象中的值QJsonObject nestedAddress = personObject["address"].toObject();qDebug() << "City:" << nestedAddress["city"].toString();qDebug() << "Zipcode:" << nestedAddress["zipcode"].toString();// 修改 JSON 對象中的值personObject["age"] = 35;// 移除 JSON 對象中的某個鍵值對personObject.remove("isStudent");// 轉換 JSON 對象為字符串QJsonDocument jsonDocument(personObject);QString jsonString = jsonDocument.toJson();qDebug() << "Updated JSON object:" << jsonString;return a.exec();
}

3. QJsonArray

  • QJsonArray 類用于表示 JSON 數組,它是值的有序集合,值可以是字符串、整數、布爾值、對象或數組。
  • 可以使用 append()、insert()、at() 等方法操作數組元素。
  • 成員函數:size() 返回數組中元素的數量,at() 根據索引獲取指定位置的元素。
#include <QCoreApplication>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 創建一個空的 JSON 數組QJsonArray fruitsArray;// 向 JSON 數組添加元素fruitsArray.append("apple");fruitsArray.append("banana");fruitsArray.append("cherry");// 創建一個包含多個不同類型元素的 JSON 數組QJsonArray mixedArray;mixedArray.append(10);mixedArray.append(true);mixedArray.append("hello");// 輸出數組元素qDebug() << "Fruits in the array:";for(const QJsonValue &value : fruitsArray) {qDebug() << value.toString();}qDebug() << "Elements in mixed array:";for(const QJsonValue &value : mixedArray) {if(value.isBool()) {qDebug() << value.toBool();} else if(value.isDouble()) {qDebug() << value.toDouble();} else if(value.isString()) {qDebug() << value.toString();}}// 訪問數組元素qDebug() << "First fruit:" << fruitsArray.at(0).toString();qDebug() << "Last fruit:" << fruitsArray.last().toString();// 修改數組元素fruitsArray.replace(1, "pear");// 移除數組元素fruitsArray.removeAt(2);// 轉換 JSON 數組為字符串QJsonDocument jsonDocument(fruitsArray);QString jsonString = jsonDocument.toJson();qDebug() << "Updated JSON array:" << jsonString;return a.exec();
}

4.JSON 數據的解析

  • 使用 QJsonDocument::fromJson() 將 JSON 字符串解析為 QJsonDocument 對象。
  • 判斷解析后的對象類型(是對象還是數組),然后獲取各個屬性的值。

5. QString與QByteArray

在 Qt 中,QString 和 QByteArray 是兩種用于處理字符串數據的類,它們在存儲和操作字符串上有一些不同之處。下面是關于 QString 和 QByteArray 的詳細介紹:

QString

  • QString 是 Qt 中用于表示 Unicode 字符串的類,它支持多種字符編碼,包括 UTF-8、UTF-16 等。

  • 特點:

  1. 支持 Unicode 字符,可以表示任意國家地區的字符。
  2. 自動轉碼:QString 會自動處理不同字符編碼之間的轉換。例如,可以使用 toUtf8() 方法將 QString 轉換為 QByteArray。
  3. 提供了豐富的字符串操作方法,如拼接、查找、替換、大小寫轉換等。

使用場景:

  • 存儲用戶界面文本、表示用戶輸入。
  • 作為跨平臺的字符串處理工具,便于處理各種字符編碼和國際化需求。

QByteArray

  • QByteArray 是 Qt 中用于表示字節數據的類,通常用于存儲二進制數據或者不包含特定字符編碼的文本數據。

特點:

  1. 與 QString 不同,QByteArray 主要是字節級別的操作,適用于處理二進制數據。
  2. 通常用于讀寫文件、網絡數據、加密解密等場景。
  3. 字節數據一般不涉及字符編碼的轉換,更適合存儲不特定編碼的數據。

使用場景:

  • 存儲二進制數據,如圖片、音頻、視頻等。
  • 讀寫文件內容,處理網絡數據傳輸。
  • 加密解密操作等需要處理字節數據的場景。

總結

  • 如果需要處理文本數據,并且涉及到字符串操作、多語言支持或者用戶界面相關的文本處理,通常使用 QString。

  • 如果處理的數據為字節數據、二進制數據或者不需要特定字符編碼的數據,可以使用 QByteArray。

三.JSON讀寫文件實戰

  • Json格式如下:
{"Name":"Ace","Sex":"man","Age":20,"Family":{"Father":"Gol·D·Roger","Mother":"Portgas·D·Rouge","Brother":["Sabo", "Monkey D. Luffy"]},"IsAlive":false,"Comment":"yyds"
}
  • 寫文件
void MainWindow::writeJson()
{//創建一個Json對象QJsonObject obj;//對象可以說是和map一模一樣//"Ace"發生了隱式類型轉換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");//構建一個Json數組的對象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");//將json的對象轉換成文檔類型QJsonDocument doc(obj);//將其轉換成字符串類型,QByteArray在qt中就是表示字符串QByteArray json = doc.toJson();//寫入磁盤文件中QFile file("G:\\qtcodetest\\QJsonTest\\mytest.json");file.open(QFile::WriteOnly);file.write(json);file.close();}
  • 讀文件
void MainWindow::readJson()
{//讀文件QFile file("G:\\qtcodetest\\QJsonTest\\mytest.json");file.open(QFile::ReadOnly);QByteArray all = file.readAll();file.close();//讀出的文件進行轉換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();}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();}}}}}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40679.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40679.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40679.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

eth0設備繁忙

當您遇到 ifconfig eth0 hw ether 20:24:07:04:18:00 命令執行后顯示 ifconfig: SIOCSIFHWADDR: Device or resource busy 錯誤時&#xff0c;這意味著您嘗試更改的網絡設備&#xff08;在這個例子中是 eth0&#xff09;目前正被占用&#xff0c;無法進行硬件地址的更改。 為了…

Map Set(Java篇詳解)

&#x1f341; 個人主頁&#xff1a;愛編程的Tom&#x1f4ab; 本篇博文收錄專欄&#xff1a;Java專欄&#x1f449; 目前其它專欄&#xff1a;c系列小游戲 c語言系列--萬物的開始_ 等 &#x1f389; 歡迎 &#x1f44d;點贊?評論?收藏&#x1f496;三連支持…

【每日一練】python列表

1、輸入一個整數列表&#xff0c;將列表中的元素按照逆序輸出。 list1[5,4,5,6] list1.reverse() print(list1)[6, 5, 4, 5]2、輸入一個字符串列表&#xff0c;輸出其中長度大于等于5的字符串&#xff0c;并且將它們轉換為大寫形式。 list1[hello,lol,ak47,aliang] for i in …

211.xv6——3(page tables)

在本實驗室中&#xff0c;您將探索頁表并對其進行修改&#xff0c;以簡化將數據從用戶空間復制到內核空間的函數。 開始編碼之前&#xff0c;請閱讀xv6手冊的第3章和相關文件&#xff1a; kernel/memlayout.h&#xff0c;它捕獲了內存的布局。kernel/vm.c&#xff0c;其中包含…

代謝組數據分析(十二):嶺回歸、Lasso回歸、彈性網絡回歸構建預測模型

歡迎大家關注全網生信學習者系列: WX公zhong號:生信學習者Xiao hong書:生信學習者知hu:生信學習者CDSN:生信學習者2介紹 在代謝物預測模型的構建中,我們采用了三種主流的回歸分析方法:嶺回歸、Lasso回歸以及彈性網絡回歸。這三種方法各有其獨特的原理和適用場景,因此在…

WPS操作技巧:制作可以打對勾的方框,只需簡單幾步!沈陽wps辦公軟件培訓

日常工作中&#xff0c;我們經常需要在表格中添加復選框&#xff0c;比如【性別選擇】、【任務完成狀態】等等&#xff0c;通過打對勾來確定狀態。今天就分別從WPS的Excel表格和Word文檔2種場景&#xff0c;介紹制作可以打對勾的復選框的方法技巧&#xff0c;掌握技巧&#xff…

25、PHP 實現兩個鏈表的第一個公共結點(含源碼)

題目&#xff1a; PHP 實現兩個鏈表的第一個公共結點 描述&#xff1a; 輸入兩個鏈表&#xff0c;找出它們的第一個公共結點。 <?php /*class ListNode{var $val;var $next NULL;function __construct($x){$this->val $x;} }*/ function FindFirstCommonNode($pHead…

構建zdppy docker鏡像

拉取鏡像 docker pull python:3.8-alpine3.19創建容器 docker run -itd --name zdppy python:3.8-alpine3.19 sh進入容器 docker exec -it zdppy sh配置pip國內源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple提交容器為鏡像 docker commit…

游戲AI的創造思路-技術基礎-計算機視覺

讓游戲的AI具備“眼睛”和“視覺”&#xff0c;就是通過計算機視覺的方法進行的。現在&#xff0c;越來越多的游戲&#xff0c;特別是動捕類游戲都在使用這個方法。當然&#xff0c;計算機視覺不僅僅用于游戲&#xff0c;越來越多的應用使用到這個技術 目錄 1. 定義 2. 發展歷…

spring 枚舉、策略模式、InitializingBean初使化組合使用示例

實現一個簡單的文本處理系統。 在這個系統中&#xff0c;我們將定義不同類型的文本處理策略&#xff0c;比如大小寫轉換、添加前綴后綴等&#xff0c;并使用工廠模式來管理這些策略。 1 定義一個枚舉來標識不同的文本處理類型 public enum TextProcessTypeEnum {UPPER_CASE,LO…

騰訊混元文生圖開源模型推出小顯存版本,6G顯存即可運行,并開源caption模型

7月4日&#xff0c;騰訊混元文生圖大模型&#xff08;混元DiT&#xff09;宣布開源小顯存版本&#xff0c;僅需6G顯存即可運行&#xff0c;對使用個人電腦本地部署的開發者十分友好&#xff0c;該版本與LoRA、ControlNet等插件&#xff0c;都已適配至Diffusers庫&#xff1b;并…

探索 Apache Paimon 在阿里智能引擎的應用場景

摘要&#xff1a;本文整理自Apache Yarn && Flink Contributor&#xff0c;阿里巴巴智能引擎事業部技術專家王偉駿&#xff08;鴻歷&#xff09;老師在 5月16日 Streaming Lakehouse Meetup Online 上的分享。內容主要分為以下三個部分&#xff1a; 一、 阿里智能引擎…

【LeetCode】全排列

目錄 一、題目二、解法完整代碼 一、題目 給定一個不含重復數字的數組 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意順序 返回答案。 示例 1&#xff1a; 輸入&#xff1a;nums [1,2,3] 輸出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] …

LVS+Nginx高可用集群--基礎篇

1.集群概述 單體部署&#xff1a; 可以將上面內容分別部署在不同的服務器上。 單體架構的優點&#xff1a; 小團隊成型就可完成開發&#xff0c;測試&#xff0c;上線 迭代周期短&#xff0c;速度快 打包方便&#xff0c;運維簡單 單體架構的挑戰&#xff1a;單節點宕機造成…

DVWA sql手注學習(巨詳細不含sqlmap)

這篇文章主要記錄學習sql注入的過程中遇到的問題已經一點學習感悟&#xff0c;過程圖片會比較多&#xff0c;比較基礎和詳細&#xff0c;不存在看不懂哪一步的過程 文章目錄 靶場介紹SQL注入 lowSQL注入 MediumSQL注入 HighSQL注入 Impossible 靶場介紹 DVWA&#xff08;Damn…

必備的 Adobe XD 輔助工具

想要高效便捷的使用 Adobe XD&#xff0c; Adobe XD 插件是必不可少的&#xff0c; Adobe XD 的插件非常多&#xff0c;但 90%都是英文&#xff0c;并且良莠不齊。在這兒挑選 9 個好用的 Adobe XD 插件給大家&#xff0c;這里是我整理的一些實用 Adobe XD 插件&#xff0c;讓你…

大屏開發系列——Echarts的基礎使用

本文為個人近期學習總結&#xff0c;若有錯誤之處&#xff0c;歡迎指出&#xff01; Echarts在vue2中的基礎使用 一、簡單介紹二、基本使用&#xff08;vue2中&#xff09;1.npm安裝2.main.js引入3.使用步驟(1)準備帶有寬高的DOM容器&#xff1b;(2)初始化echarts實例&#xff…

gcc: warning: -Wunused-function;加了選項,為什么就不報警告呢?

文章目錄 問題clang的編譯而使用gcc是就不報問題分析原因如果是非static的函數問題 下面這個代碼段,其中這個函數hton_ext_2byte,在整個程序里就沒有使用。 static inline uint16_t hton_ext_2byte(uint8_t **p) {uint16_t v;******return v;

PHP宜邦家政服務管理系統-計算機畢業設計源碼04426

目 錄 摘要 1 緒論 1.1 選題背景與意義 1.2開發現狀 1.3論文結構與章節安排 2 宜邦家政服務管理系統系統分析 2.1 可行性分析 2.1.1 技術可行性分析 2.1.2 經濟可行性分析 2.1.3 操作可行性分析 2.2 系統功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系統用…

國標GB28181視頻匯聚平臺LntonCVS視頻監控安防平臺與國標協議對接解決方案

應急管理部門以“以信息化推動應急管理能力現代化”為總體目標&#xff0c;加快現代信息技術與應急管理業務深度融合&#xff0c;全面支持現代應急管理體系建設&#xff0c;這不僅是國家加強和改進應急管理工作的關鍵舉措&#xff0c;也是應對日益嚴峻的應急管理形勢和滿足公眾…