C++中的JSON處理方法及實現
JSON是一種輕量級資料交換格式,易於閱讀和編寫,也易於機器解析和產生。使用JSON格式可以方便地在各個系統之間傳遞資料。在C 中,有許多開源的JSON函式庫可以進行JSON的處理。本文將介紹一些常用的C 中的JSON處理方法及實作。
C 中的JSON處理方法
- RapidJSON
RapidJSON是一個快速的C JSON解析器/產生器,提供DOM、SAX和內存池樣式API。它主要的特點有以下幾點:
- 記憶體佔用小,執行速度快;
- #支援UTF-8、UTF-16、UTF-32等多種編碼格式;
- 支援C 11的move sematics,使記憶體管理更有效率;
- 支援SAX風格的API,能夠對大型JSON檔案進行高效解析;
- 支援自訂分配策略(allocator)。
RapidJSON中,JSON物件可以透過DOM和SAX方式解析,其中DOM方式可以透過Value類別來實現。以下是一個使用RapidJSON產生並解析JSON的範例程式碼:
#include "rapidjson/document.h" #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h" #include <iostream> using namespace rapidjson; using namespace std; int main() { // 生成JSON StringBuffer s; Writer<StringBuffer> writer(s); writer.StartObject(); writer.Key("name"); writer.String("Tom"); writer.Key("age"); writer.Int(20); writer.EndObject(); // 解析JSON Document d; d.Parse(s.GetString()); cout << "name: " << d["name"].GetString() << endl; cout << "age: " << d["age"].GetInt() << endl; return 0; }
- Boost.PropertyTree
Boost.PropertyTree是一個簡單易用的屬性處理函式庫,能夠處理各種屬性格式。其中,它也支援解析和生成JSON。 Boost.PropertyTree比RapidJSON略慢,但也有一些特點:
- ##支援多種資料格式,包括INI檔案、XML和JSON等;支援C 標準函式庫和BOOST函式庫中的資料類型;具有可插拔的資料格式處理能力,使用者可以編寫自己的擴充格式。
#include <iostream> #include <boost/property_tree/ptree.hpp> #include <boost/property_tree/json_parser.hpp> using namespace std; using boost::property_tree::ptree; using boost::property_tree::read_json; using boost::property_tree::write_json; int main() { // 生成JSON ptree pt; pt.put("name", "Tom"); pt.put("age", 20); // 解析JSON string json_str; write_json(cout, pt); cout << endl; read_json("test.json", pt); cout << "name: " << pt.get<string>("name") << endl; cout << "age: " << pt.get<int>("age") << endl; return 0; }
- JsonCpp
- 支援UTF-8編碼;#支援JSON的解析與產生;提供物件導向封裝的API;支援C 11的move sematics。
#include <iostream> #include <json/json.h> using namespace std; using namespace Json; int main() { // 生成JSON Value root; root["name"] = "Tom"; root["age"] = 20; string json_str = root.toStyledString(); cout << json_str << endl; // 解析JSON Reader reader; Value value; reader.parse("{"name":"Tom","age":20}", value, false); cout << "name: " << value["name"].asString() << endl; cout << "age: " << value["age"].asInt() << endl; return 0; }
- Nlohmann.Json
- 單一檔案頭實現,使用方便;支援多種STL容器;非常輕量級, headers only;格式化輸出非常友善。
#include <iostream> #include <nlohmann/json.hpp> using namespace std; using json = nlohmann::json; int main() { // 生成JSON json j; j["name"] = "Tom"; j["age"] = 20; string json_str = j.dump(); cout << json_str << endl; // 解析JSON json j2 = json::parse("{"name":"Tom","age":20}"); cout << "name: " << j2["name"] << endl; cout << "age: " << j2["age"] << endl; return 0; }
- RapidJSON實作
// 生成JSON Value root(kObjectType); Value person(kObjectType); person.AddMember("name", "Tom", allocator); person.AddMember("age", 20, allocator); root.AddMember("person", person, allocator); StringBuffer buffer; Writer<StringBuffer> writer(buffer); root.Accept(writer); cout << buffer.GetString() << endl;
// 解析JSON Document d; d.Parse("{"person":{"name":"Tom","age":20}}"); const Value& person = d["person"]; const string name = person["name"].GetString(); const int age = person["age"].GetInt();
- Boost.PropertyTree實作
// 生成JSON ptree root; ptree person; person.put("name", "Tom"); person.put("age", 20); root.add_child("person", person); stringstream stream; write_json(stream, root); cout << stream.str() << endl;
// 解析JSON ptree root; read_json("test.json", root); const string name = root.get<string>("person.name"); const int age = root.get<int>("person.age");
- JsonCpp實作
// 生成JSON Value root; Value person; person["name"] = "Tom"; person["age"] = 20; root["person"] = person; cout << root.toStyledString() << endl;
// 解析JSON Reader reader; Value value; string json_str = "{"person":{"name":"Tom","age":20}}"; reader.parse(json_str, value); const string name = value["person"]["name"].asString(); const int age = value["person"]["age"].asInt();
- Nlohmann.Json實作
// 生成JSON json j; j["person"]["name"] = "Tom"; j["person"]["age"] = 20; cout << j.dump() << endl;
// 解析JSON json j2 = json::parse("{"person":{"name":"Tom","age":20}}"); const string name = j2["person"]["name"]; const int age = j2["person"]["age"];
以上是C++中的JSON處理方法及實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

華為手機如何實現雙微信登入?隨著社群媒體的興起,微信已成為人們日常生活中不可或缺的溝通工具之一。然而,許多人可能會遇到一個問題:在同一部手機上同時登入多個微信帳號。對於華為手機用戶來說,實現雙微信登入並不困難,本文將介紹華為手機如何實現雙微信登入的方法。首先,華為手機自帶的EMUI系統提供了一個很方便的功能-應用程式雙開。透過應用程式雙開功能,用戶可以在手機上同

程式語言PHP是一種用於Web開發的強大工具,能夠支援多種不同的程式設計邏輯和演算法。其中,實作斐波那契數列是一個常見且經典的程式設計問題。在這篇文章中,將介紹如何使用PHP程式語言來實作斐波那契數列的方法,並附上具體的程式碼範例。斐波那契數列是一個數學上的序列,其定義如下:數列的第一個和第二個元素為1,從第三個元素開始,每個元素的值等於前兩個元素的和。數列的前幾元

如何在華為手機上實現微信分身功能隨著社群軟體的普及和人們對隱私安全的日益重視,微信分身功能逐漸成為人們關注的焦點。微信分身功能可以幫助使用者在同一台手機上同時登入多個微信帳號,方便管理和使用。在華為手機上實現微信分身功能並不困難,只需要按照以下步驟操作即可。第一步:確保手機系統版本和微信版本符合要求首先,確保你的華為手機系統版本已更新至最新版本,以及微信App

PHP數組轉JSON的效能最佳化方法包括:使用JSON擴充和json_encode()函數;新增JSON_UNESCAPED_UNICODE選項以避免字元轉義;使用緩衝區提高循環編碼效能;快取JSON編碼結果;考慮使用第三方JSON編碼庫。

Jackson庫中的註解可控制JSON序列化和反序列化:序列化:@JsonIgnore:忽略屬性@JsonProperty:指定名稱@JsonGetter:使用獲取方法@JsonSetter:使用設定方法反序列化:@JsonIgnoreProperties:忽略屬性@ JsonProperty:指定名稱@JsonCreator:使用建構子@JsonDeserialize:自訂邏輯

PHP遊戲需求實現指南隨著網路的普及和發展,網頁遊戲的市場也越來越火爆。許多開發者希望利用PHP語言來開發自己的網頁遊戲,而實現遊戲需求是其中一個關鍵步驟。本文將介紹如何利用PHP語言來實現常見的遊戲需求,並提供具體的程式碼範例。 1.創造遊戲角色在網頁遊戲中,遊戲角色是非常重要的元素。我們需要定義遊戲角色的屬性,例如姓名、等級、經驗值等,並提供方法來操作這些

在現今的軟體開發領域中,Golang(Go語言)作為一種高效、簡潔、並發性強的程式語言,越來越受到開發者的青睞。其豐富的標準庫和高效的並發特性使它成為遊戲開發領域的一個備受關注的選擇。本文將探討如何利用Golang來實現遊戲開發,並透過具體的程式碼範例來展示其強大的可能性。 1.Golang在遊戲開發中的優勢作為靜態類型語言,Golang正在建構大型遊戲系統

PHP陣列可透過json_encode()函數轉換為JSON字串(例如:$json=json_encode($array);),反之亦可用json_decode()函數從JSON轉換為陣列($array=json_decode($json);) 。其他技巧還包括:避免深度轉換、指定自訂選項以及使用第三方程式庫。
