一、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-hant/n/368700.html
微信掃一掃
支付寶掃一掃