RapidJSON 處理 JSON(高性能 C++ 庫)(四)

第四部分:RapidJSON 處理 JSON(高性能 C++ 庫)

?? 快速掌握 JSON!文章 + 視頻雙管齊下 ??

如果你覺得閱讀文章太慢,或者更喜歡 邊看邊學 的方式,不妨直接觀看我錄制的 RapidJSON 課程視頻!?? 視頻里會用更直觀的方式講解 RapidJSON 的核心概念、實戰技巧,并配有動手演示,讓你更高效地掌握 RapidJSON 的處理方法!

當然,如果你喜歡深度閱讀,這篇文章會幫助你系統地理解 RapidJSON,從基礎到進階!無論你選擇哪種方式,最終目標都是讓你成為 RapidJSON 處理的高手!??

?? 點擊這里觀看視頻 ?? 視頻鏈接

一:RapidJSON 庫概述與環境配置

1.1 RapidJSON 是什么?

? RapidJSON 是一個高效可移植的 C++ JSON 解析庫,專為高性能應用設計。它具有以下特點:

? 超快:比許多 JSON 庫(如 cJSON、JSONCPP)解析速度更快,適用于高性能應用。

? 全功能:支持DOM(文檔對象模型)解析和SAX(流式解析),適用于不同場景。

? 零依賴:僅使用 C++ 標準庫,無需額外的庫支持。

1.2 RapidJSON 適用場景

? 大規模數據處理(如日志分析、金融數據解析)。

? 游戲開發(解析游戲配置)。

? 嵌入式開發(存儲和解析 IoT 設備 JSON 數據)。

? 高并發服務器(解析 API 響應,提高吞吐量)。

1.3 下載和安裝 RapidJSON

方法 1:使用 vcpkg安裝(推薦)(Windows / Linux)

#如果使用 vcpkg 作為包管理工具,可以直接安裝:
vcpkg install rapidjson

方法 2:使用系統包管理器

  • Ubuntu/Debian
sudo apt install rapidjson-dev
  • Mac(Homebrew)
brew install rapidjson

安裝后,在 CMakeLists.txt 中添加:

find_package(RapidJSON CONFIG REQUIRED)

然后在代碼中:

#include <rapidjson/document.h>

方法 2:手動下載

1.從 RapidJSON GitHub 下載源碼。

訪問該頁面,點擊綠色的 Code 按鈕,選擇 Download ZIP,然后解壓縮到你本地的某個目錄,或者使用 Git 命令進行克隆:

git clone https://github.com/Tencent/rapidjson.git

2.將 include目錄加入項目:

#include "rapidjson/document.h"
#include "rapidjson/prettywriter.h" // 用于格式化輸出
#include "rapidjson/stringbuffer.h" // 用于緩存輸出

這些頭文件提供了 RapidJSON 主要功能的接口:

  • document.h:用于解析 JSON 數據并創建 JSON 對象。

  • prettywriter.h:用于將 JSON 數據格式化為易讀的字符串。

  • stringbuffer.h:用于將 JSON 數據寫入字符串。

3.RapidJSON 僅包含頭文件,因此無需編譯。

? RapidJSON 是只有頭文件的 C++ 庫。只需把 include/rapidjson 目錄復制至系統或項目的 include 目錄中。

1.4 在 C++ 項目中集成 RapidJSON(CMake / vcpkg)

如果項目使用 CMake,可以這樣安裝:

  1. 在 CMakeLists.txt中添加:

    include(FetchContent)
    FetchContent_Declare(rapidjsonGIT_REPOSITORY https://github.com/Tencent/rapidjson.gitGIT_TAG master
    )
    FetchContent_MakeAvailable(rapidjson)
    
  2. 然后在代碼中 #include <rapidjson/document.h> 直接使用。

使用示例:

#include <iostream>
#include <rapidjson/document.h>int main() {const char* json = R"({"name": "Alice", "age": 25, "skills": ["C++", "Python"]})";// 解析 JSONrapidjson::Document doc;doc.Parse(json);// 讀取數據if (doc.HasMember("name") && doc["name"].IsString()) {std::cout << "Name: " << doc["name"].GetString() << std::endl;}if (doc.HasMember("age") && doc["age"].IsInt()) {std::cout << "Age: " << doc["age"].GetInt() << std::endl;}if (doc.HasMember("skills") && doc["skills"].IsArray()) {std::cout << "Skills: ";for (auto& skill : doc["skills"].GetArray()) {std::cout << skill.GetString() << " ";}std::cout << std::endl;}return 0;
}

二:使用 RapidJSON 解析 JSON

  • 解析 JSON 字符串為 RapidJSON DOM
  • 訪問 JSON 對象的鍵值對和數組元素
  • 使用 SAX 解析大 JSON 文件(事件驅動方式)
2.1 解析 JSON 對象
2.1.1 解析基本 JSON

? 目標 JSON

{"name": "張三","age": 30,"married": true
}

? C++ 代碼

#include <iostream>
#include "rapidjson/document.h"int main() {const char* json = R"({"name": "張三", "age": 30, "married": true})";rapidjson::Document doc;if (doc.Parse(json).HasParseError()) {cout << "JSON 解析失敗!" << endl;return -1;}std::cout << "姓名: " << doc["name"].GetString() << endl;cout << "年齡: " << doc["age"].GetInt() << endl;cout << "已婚: " << (doc["married"].GetBool() ? "是" : "否") << endl;return 0;
}

? 輸出

姓名: 張三
年齡: 30
已婚: 是
2.1.2 解析 JSON 數據并輸出
#include <iostream>
#include "rapidjson/document.h"int main() {// JSON 字符串const char* json = R"({"name": "John","age": 30,"city": "New York"})";// 創建 RapidJSON 文檔對象rapidjson::Document document;// 解析 JSON 字符串if (document.Parse(json).HasParseError()) {std::cerr << "JSON 解析失敗!" << std::endl;return 1;}// 檢查并輸出每個成員if (document.HasMember("name") && document["name"].IsString()) {std::cout << "Name: " << document["name"].GetString() << std::endl;}if (document.HasMember("age") && document["age"].IsInt()) {std::cout << "Age: " << document["age"].GetInt() << std::endl;}if (document.HasMember("city") && document["city"].IsString()) {std::cout << "City: " << document["city"].GetString() << std::endl;}return 0;
}

代碼說明:

  1. 創建 RapidJSON 文檔對象:
    • rapidjson::Document document;:這是用來解析 JSON 數據的對象。它內部會保存 JSON 數據的結構。
  2. 解析 JSON 字符串:
    • document.Parse(json):解析給定的 JSON 字符串。如果解析成功,返回值為 true,否則會返回錯誤信息。
  3. 檢查 JSON 成員并輸出:
    • HasMember("name"):檢查 JSON 對象是否包含名為 "name" 的字段。
    • document["name"].GetString():從 JSON 對象中提取 "name" 字段的值,并作為字符串輸出。
  4. 輸出解析結果:
    • 根據 JSON 中的字段,程序將輸出每個字段的內容,例如 "name": "John" 將輸出 Name: John

輸出結果:

Name: John
Age: 30
City: New York

2.1.3 進一步擴展

你可以擴展這個示例,處理更多復雜的 JSON 數據,甚至解析嵌套的 JSON 對象或數組。

解析嵌套 JSON 對象

假設我們有一個更復雜的 JSON 字符串,包含嵌套的 JSON 對象:

{"name": "John","age": 30,"address": {"street": "5th Avenue","city": "New York"}
}

你可以如下解析:

#include <iostream>
#include "rapidjson/document.h"int main() {const char* json = R"({"name": "John","age": 30,"address": {"street": "5th Avenue","city": "New York"}})";rapidjson::Document document;if (document.Parse(json).HasParseError()) {std::cerr << "JSON 解析失敗!" << std::endl;return 1;}// 輸出基礎字段std::cout << "Name: " << document["name"].GetString() << std::endl;std::cout << "Age: " << document["age"].GetInt() << std::endl;// 解析嵌套的 JSON 對象 "address"if (document.HasMember("address") && document["address"].IsObject()) {const rapidjson::Value& address = document["address"];std::cout << "Street: " << address["street"].GetString() << std::endl;std::cout << "City: " << address["city"].GetString() << std::endl;}return 0;
}

輸出結果:

Name: John
Age: 30
Street: 5th Avenue
City: New York

總結:

  • 使用 RapidJSON 可以方便地解析 JSON 字符串,提取其中的數據,并進行相應的處理。
  • 解析時需要檢查字段是否存在,避免訪問不存在的字段引發錯誤。
  • 可以解析簡單的 JSON 字符串,也可以處理嵌套的 JSON 對象,甚至是數組等復雜數據結構。

2.2 解析 JSON 數組

?? 示例 2:解析數組

? 目標 JSON

{"cities": ["北京", "上海", "廣州"]
}

? C++ 代碼

const char* json = R"({"cities": ["北京", "上海", "廣州"]})";
Document doc;
doc.Parse(json);const Value& cities = doc["cities"];
for (SizeType i = 0; i < cities.Size(); i++) {cout << "城市 " << i + 1 << ": " << cities[i].GetString() << endl;
}

? 輸出

城市 1: 北京
城市 2: 上海
城市 3: 廣州
2.3 解析并格式化輸出 JSON 數據

RapidJSON 提供了 PrettyWriter 類,允許你對 JSON 數據進行格式化輸出,加入縮進、換行等

代碼示例:解析并格式化輸出 JSON 數據

#include <iostream>
#include "rapidjson/document.h"
#include "rapidjson/prettywriter.h"
#include "rapidjson/stringbuffer.h"int main() {// 原始 JSON 字符串const char* json = R"({"name": "John","age": 30,"city": "New York"})";// 創建 RapidJSON 文檔對象rapidjson::Document document;// 解析 JSON 字符串if (document.Parse(json).HasParseError()) {std::cerr << "JSON 解析失敗!" << std::endl;return 1;}// 創建一個 StringBuffer 用于保存格式化后的 JSON 字符串rapidjson::StringBuffer buffer;// 創建 PrettyWriter 對象,傳入 StringBufferrapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer);// 將 JSON 數據格式化并輸出到 StringBufferdocument.Accept(writer);

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

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

相關文章

chromem-go + ollama + bge-m3 進行文檔向量嵌入和查詢

Ollama 安裝 https://ollama.com/download Ollama 運行嵌入模型 bge-m3:latest ollama run bge-m3:latestchromem-go 文檔嵌入和查詢 package mainimport ("context""fmt""runtime""github.com/philippgille/chromem-go" )func ma…

【LeetCode 題解】數據庫:180. 連續出現的數字

一、問題描述 給定一個Logs表&#xff0c;包含自增 ID 和數字字段&#xff1a; CREATE TABLE Logs (id INT PRIMARY KEY AUTO_INCREMENT,num VARCHAR(50) );要求編寫 SQL 查詢&#xff0c;找出所有至少連續出現三次的數字。例如&#xff1a; --------- | id | num | -------…

MaxEnt模型進階:基于R語言自動化與GIS空間建模的物種棲息地精準預測

生物多樣性的空間分布規律及其對環境變化的響應機制&#xff0c;是生態學與地理學研究的前沿議題。在氣候變化加劇和人類活動干擾的雙重壓力下&#xff0c;如何精準預測物種潛在分布范圍、識別關鍵環境驅動因子&#xff0c;已成為制定生物保護策略的核心科學問題。物種分布模型…

緩存雪崩解決方案:二級緩存VS隨機TTL

背景 在學習緩存雪崩的時候&#xff0c;了解到有二級緩存和隨機TTL兩個解決方案&#xff0c;但是在學習之后&#xff0c;個人認為二級緩存本質上還是利用兩層緩存的過期時間不一致來實現緩存過期時間隨機化&#xff0c;這不就是和隨機TTL一樣嗎&#xff0c;故有了這篇思考&…

Android View事件分發機制深度解析

在Android面試中&#xff0c;關于View事件分發機制的考察往往不僅限于基礎流程&#xff0c;更關注底層原理、性能優化和實際應用場景。以下是針對面試的全面回答策略&#xff1a; 一、基礎回答框架 核心三要素&#xff1a; 傳遞流程 "事件分發遵循Activity → Window →…

2829. k-avoiding 數組的最小總和

2829. k-avoiding 數組的最小總和 題目鏈接&#xff1a;2829. k-avoiding 數組的最小總和 代碼如下&#xff1a; class Solution { public:int minimumSum(int n, int k) {int m min(k / 2, n);return (m * (m 1) (k * 2 n - m - 1) * (n - m)) / 2;} };

phpStorm2021.3.3在windows系統上配置Xdebug調試

開始 首先根據PHP的版本下載并安裝對應的Xdebug擴展在phpStorm工具中找到設置添加服務添加php web page配置完信息后 首先根據PHP的版本下載并安裝對應的Xdebug擴展 我使用的是phpStudy工具&#xff0c;直接在php對應的版本中開啟xdebug擴展&#xff0c; 并在php.ini中添加如下…

LabVIEW永磁同步電機性能測試系統

開發了一種基于LabVIEW的永磁同步電機&#xff08;PMSM&#xff09;性能測試系統的設計及應用。該系統針對新能源汽車使用的電機進行穩態性能測試&#xff0c;解決了傳統測試方法成本高、效率低的問題&#xff0c;實現了測試自動化&#xff0c;提高了數據的準確性和客觀性。 ?…

谷粒商城:Redisson

目錄 Redisson 整合Redisson RLock RReadWriteLock RSemaphore RCountDownLatch 優化三級分類緩存 緩存一致性問題 雙寫模式 失效模式 臟數據解決 Redisson 提供redis分布式鎖&#xff08;Distributed locks with Redis&#xff09;的java客戶端 整合Redisson 引入 …

Linux系統調用編程

目錄 一. 理解進程和線程的概念。并在Linux系統下進行相應操作 1.1概念 1.1.1進程(Process) 1.1.2 線程(Thread) 1.2操作 1.2.1用 ps -a 命令查看系統中各進程的編號pid 1.2.2用kill 命令終止一個進程pid 二. 解釋Linux的“虛擬內存管理”&#xff0c;它與stm32中的 真…

25-智慧旅游系統(協同算法)三端

介紹 技術&#xff1a; 基于 B/S 架構 SpringBootMySQLLayuivue 環境&#xff1a; Idea mysql maven jdk1.8 node 管理端功能 首頁展示圖表&#xff1a;以數據可視化方式展示關鍵業務數據。 用戶管理&#xff1a;管理系統用戶&#xff0c;包括查看、編輯等操作。 供應商管…

【stm32--HAL庫DMA+USART+空閑中斷不定長收發數據】

串口通信-Hal庫實現不定長度收發&#xff0c;DMAUSART DMA串口STM32CUBEMX配置&#xff08;工程創建&#xff09;基礎配置時鐘配置工程配置 代碼編寫現象 DMA 在正式配置之前&#xff0c;我們先來一起簡單了解一下DMA。DMA&#xff08;Direct Memory Access&#xff0c;直接內…

沉浸式體驗測評|AI Ville:我在Web3小鎮“生活”了一周

最近&#xff0c;我在朋友的推薦下&#xff0c;體驗了 aivillebot 的項目。起初&#xff0c;我只是抱著試試看的心態&#xff0c;心想這不就是個 Web3 版的《星露谷物語》嗎&#xff1f; 但是一周下來&#xff0c;我發現這個虛擬小鎮也沒那么簡單——里面的居民不是目前端游或鏈…

FPGA學習-基于 DE2-115 板的 Verilog 分秒計數器設計與按鍵功能實現

一、核心功能設計 按鍵暫停/繼續&#xff1a;通過KEY1控制計時狀態 按鍵消抖處理&#xff1a;20ms消抖周期消除機械抖動 硬件資源分配&#xff1a;符合DE2-115開發板引腳規范 二、核心模塊實現詳解 1. 頂層模塊&#xff08;counter&#xff09; module counter(input CL…

后端開發 SpringBoot 工程模板

概述 本篇文章主要記錄如何開發一個通用的 SpringBoot 工程開發框架的項目模板&#xff0c;這樣后續需要開發項目時就可以直接開箱直用了&#xff0c;省區了很多重復步驟。 項目初始化 創建項目&#xff1a; 按照我的選項來選&#xff0c;然后點擊 create&#xff0c;等待文…

OpenCv(五)——邊緣檢測

目錄 邊緣檢測 一、sobel算子邊緣檢測 &#xff08;1&#xff09;原理 1、X軸方向的邊緣檢測 2、Y軸方向的邊緣檢測 &#xff08;2&#xff09;sobel算子參數 &#xff08;3&#xff09;X軸方向邊緣檢測代碼演示 1、顯示圓的圖像 2、x方向上的邊緣檢測&#xf…

無人機數據鏈技術及運行方式詳解!

一、無人機數據鏈技術要點 1. 通信傳輸技術 頻段選擇&#xff1a; 常用頻段包括 L波段&#xff08;1-2 GHz&#xff09;、C波段&#xff08;4-8 GHz&#xff09;、Ku/K波段&#xff08;12-40 GHz&#xff09;&#xff0c;不同頻段在傳輸距離、帶寬和抗干擾性間權衡。 低…

AI Agent 實戰:搭建個人在線旅游助手

AI Agent 實戰&#xff1a;搭建個人在線旅游助手 本次實驗中&#xff0c;我們將繼續探索 Agent 的提示詞&#xff0c;學習更加規范的提示詞撰寫方法。 本實驗中你將掌握的知識點 使用 Dify 構建 Agent 的方法結構化的提示詞撰寫技巧變量的使用方法 1. 準備 在新建 Agent 之…

檢索增強生成(RAG):強化 AI 智能體的知識 “武裝”

技術點目錄 第一章、智能體(Agent)入門第二章、基于字節Coze 構建智能體(Agent)第三章、基于其他平臺構建智能體&#xff08;Agent&#xff09;第四章、國內外智能體(Agent)經典案例詳解第五章、大語言模型應用開發框架LangChain入門第六章、基于LangChain的大模型API接入第七章…

vscode 打開工程 看不到文件目錄

vscode 打開工程 看不到文件目錄 View->Explorer 快捷鍵&#xff1a;CtrlShiftE