一、jsoncpp介紹
jsoncpp是一個用於序列化和反序列化JSON數據的C++庫。它由Thunder Jenkins編寫,可用於許多不同類型的應用程序,從簡單的命令行工具到大型分佈式系統。jsoncpp支持C++98/03標準,並且在這些標準下提供了一些高級功能。
jsoncpp主要特點有:
1. 速度快,因為是用C++編寫的
2. 高效,支持讀寫任意大小的JSON文件並使用內存映射技術進行高速讀取,同時支持延遲加載
3. 易用性高,提供了許多簡便的方法,可以快速地實現JSON序列化和反序列化
二、jsoncpp的使用
jsoncpp的用法很簡單,只需包含json/json.h文件即可使用。以下是一個基本示例:
#include #include "json/json.h" using namespace std; int main() { Json::Value root; // 創建一個根節點 root["name"] = "Tom"; // 添加一對「鍵/值」對 root["age"] = 20; cout << root.toStyledString() << endl; // 輸出JSON格式的字符串 return 0; }
輸出結果為:
{ "name" : "Tom", "age" : 20 }
可以看出,jsoncpp提供了一個非常簡潔的API,可以輕鬆地創建和解析JSON對象。同時,jsoncpp還支持從JSON文件中讀取和寫入JSON對象,而不需要我們手動解析和序列化。
三、jsoncpp的高級用法
1. 對象序列化和反序列化
在jsoncpp中,對象可以使用Json::Value類型表示。可以使用Json::StyledWriter或Json::FastWriter類將Json::Value對象序列化為JSON字符串。以下是一個示例:
#include #include "json/json.h" using namespace std; class Person { public: string name; int age; }; int main() { Person p; p.name = "Tom"; p.age = 20; // 序列化 Json::Value root; root["name"] = p.name; root["age"] = p.age; Json::StyledWriter writer; string json_str = writer.write(root); // 將Json::Value對象序列化為JSON字符串 cout << json_str << endl; // 反序列化 Json::Reader reader; Json::Value value; reader.parse(json_str, value); // 將JSON字符串解析為Json::Value對象 p.name = value["name"].asString(); p.age = value["age"].asInt(); cout << p.name << ", " << p.age << endl; return 0; }
上面的程序演示了如何將一個自定義的Person對象序列化為JSON字符串,並在需要的時候反序列化成原始對象。Json::Value對象是一個非常靈活的數據類型,可以存儲任意類型的數據,包括JSON數組、JSON對象和基本類型。
2. JSON文件讀寫
jsoncpp還提供了從JSON文件中讀取和寫入JSON對象的API,可以使用Json::Reader和Json::StreamWriter類進行文件解析和輸出。以下是一個使用JSON文件的示例:
#include #include #include "json/json.h" using namespace std; int main() { Json::Reader reader; Json::Value root; ifstream ifs("person.json"); reader.parse(ifs, root); // 從JSON文件中解析JSON對象 string name = root["name"].asString(); int age = root["age"].asInt(); cout << name << ", " << age << endl; ofstream ofs("person.json"); Json::StyledStreamWriter writer; writer.write(ofs, root); // 將JSON對象寫入JSON文件 return 0; }
上面的程序演示了如何從JSON文件中讀取JSON對象,並將修改後的JSON對象寫回同一個文件。Json::StreamWriter提供了非常靈活的輸出格式選項,可以控制輸出格式,使輸出更加易於閱讀。
3. JSON數據校驗
Jsoncpp還支持使用Json::Value::isValid()方法檢查Json::Value對象中的數據是否有效。Json::Value::isNull()方法用於檢查對象是否為空。以下是一個示例:
#include #include "json/json.h" using namespace std; int main() { Json::Value root; // 下面這行會替換掉上面的Json::Value對象 Json::Reader reader; reader.parse("null", root); // 將JSON字符串解析為Json::Value對象 if(root.isValid() && !root.isNull()) { cout << "JSON object is valid" << endl; } else { cout << "JSON object is invalid" << endl; } return 0; }
可以看到,isValid()方法只有在Json::Value對象有效時才會返回true。isNull()方法在對象為空時返回true。
4. JSON數據訪問
jsoncpp還支持使用Json::Value::isArray()、Json::Value::isObject()和Json::Value::size()方法設置和訪問JSON數據。下面是一個示例:
#include #include "json/json.h" using namespace std; int main() { Json::Value root; Json::Value array; for(int i = 0; i < 3; ++i) { Json::Value val; val["name"] = "Tom"; val["age"] = 20 + i; array.append(val); // 在JSON數組中添加元素 } root["person"] = array; // 將JSON數組添加到JSON對象中 if(root["person"].isArray()) { int size = root["person"].size(); for(int i = 0; i < size; ++i) { cout << root["person"][i]["name"].asString() << ", " << root["person"][i]["age"].asInt() << endl; } } return 0; }
可以看到,使用Json::Value::isArray()方法可以判斷JSON對象是否為數組。使用Json::Value::size()方法可以獲取JSON數組中元素的數量。可以使用Json::Value::append()方法向JSON數組中添加元素,並使用Json::Value::asString()和Json::Value::asInt()等方法訪問數據。
總結
jsoncpp是C++中一個很實用的JSON庫,使用它可以輕鬆地實現JSON數據的序列化和反序列化。jsoncpp還提供了高級函數,可以幫助開發人員處理常見的JSON數據必需和高效的讀寫操作。
原創文章,作者:MKUXF,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/368700.html