1.JsonCpp第三方庫
JSONCPP?是一個開源的 C++ 庫,用于解析和生成 JSON(JavaScript Object Notation)數據。它提供了簡單易用的接口,支持 JSON 的序列化和反序列化操作,適用于處理配置文件、網絡通信數據等場景。
2.Json 數據格式
JSON 是一種輕量級的數據交換格式,采用完全獨立于編程語言的文本格式來存儲和表示數據。
比如:我們想表示一個 同學的信息
C 代碼表示:
char *name = "xx";
int age = 18;
float score[3] = {88.5, 99, 58};
Json 表示:
{"姓名" : "xx","年齡" : 18,"成績" : [88.5, 99, 58],"愛好" :{"書籍" : "西游記","運動" : "打籃球"}
}
包含以下基本類型:
- 對象(Object):鍵值對集合,用?
{}
?包裹,如?{"name": "Alice", "age": 25}
。 - 數組(Array):有序值列表,用?
[]
?包裹,如?[1, "text", true]
。 - 值(Value):可以是字符串、數字、布爾值、
null
、對象或數組。
在 JSONCPP 中,所有?JSON 數據均通過?Json::Value
?類表示。
3.JsonCpp 介紹
Jsoncpp
?庫主要是用于實現 Json 格式數據的序列化和反序列化,它實現了將多個數據對象組織成為 json 格式字符串,以及將 Json 格式字符串解析得到多個數據對象的功能。
先看一下 Json 數據對象類的表示
- 功能:存儲任意 JSON 數據,支持動態類型判斷。
- 常用方法:
class Json::Value{Value& operator=(const Value &other); //Value重載了[]和=,因此所有的賦值和獲取數據都可以通過 Value& operator[](const std::string& key);//簡單的?式完成 val["name"] = "xx";Value& operator[](const char* key); // 訪問或創建鍵值對Value removeMember(const char* key);//移除元素 const Value& operator[](ArrayIndex index) const; //val["score"][0]Value& append(const Value& value);//添加數組元素val["score"].append(88); ArrayIndex size() const;//獲取數組元素個數 val["score"].size(); std::string asString() const;//轉string string name = val["name"].asString();const char* asCString() const;//轉char* char *name = val["name"].asCString();// 獲取值(需確保類型正確)Int asInt() const;//轉int int age = val["age"].asInt(); float asFloat() const;//轉float float weight = val["weight"].asFloat(); bool asBool() const;//轉 bool bool ok = val["ok"].asBool(); // 判斷類型bool isObject() const;bool isArray() const;bool isString() const;
};
生成器(序列化接口 – Writer)
class JSON_API StreamWriter {virtual int write(Value const& root, std::ostream* sout) = 0;
}
class JSON_API StreamWriterBuilder : public StreamWriter::Factory {virtual StreamWriter* newStreamWriter() const;
}// 使用如下:
Json::StreamWriterBuilder builder;
builder.settings_["indentation"] = " "; // 縮進兩空格
std::string jsonStr = Json::writeString(builder, root);
解析器(反序列化接口–Reader)
class JSON_API CharReader {virtual bool parse(char const* beginDoc, char const* endDoc, Value* root, std::string* errs) = 0;
}
class JSON_API CharReaderBuilder : public CharReader::Factory {virtual CharReader* newCharReader() const;
}
// 使用如下:
Json::CharReaderBuilder builder;
std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
JSONCPP_STRING errs;
bool success = reader->parse(jsonStr, jsonStr + strlen(jsonStr), &root, &errs);
小結,主要用的 三個類 如下:
-
Json::Value
類:中間數據存儲類- 就需要先存儲到?
Json::Value
?對象中如果要將數據對象進行序列化,如果要將數據傳進行反序列化,就是解析后,將數據對象放入到J?Json::Value
?對象中
- 就需要先存儲到?
-
Json::StreamWriter
類:用于進行數據序列化-
Json::StreamWriter::write()
?序列化函數 -
Json::StreamWriterBuilder類: Json::StreamWriter
?工廠類 – 用于生產?Json:.StreamWriter
?對象
-
-
Json::CharReader
類:反序列化類Json::CharReader::parse()
?反序列化函數Json::CharReaderBuilder
:Json::CharReader
工廠類-用于生產?Json::.CharReader
?對象
4.JsonCpp的使用
序列化(C++ 對象 -> JSON)
序列化是將 C++ 對象轉換為 JSON 格式的字符串。我們可以通過 Json::Value
類來構建 JSON 對象,然后使用 Json::StreamWriter
或 Json::FastWriter
來生成 JSON 字符串。
#include <iostream>
#include <json/json.h>int main() {// 創建一個 Json::Value 對象Json::Value root;// 添加一些鍵值對root["name"] = "Alice";root["age"] = 30;root["is_student"] = false;// 創建一個數組Json::Value languages;languages.append("C++");languages.append("Python");languages.append("JavaScript");root["languages"] = languages;// 使用 FastWriter 將 Json::Value 轉換為 JSON 字符串Json::FastWriter fastWriter;std::string jsonString = fastWriter.write(root);// 輸出 JSON 字符串std::cout << "Serialized JSON: " << jsonString << std::endl;return 0;
}
序列化結果
Serialized JSON: {"age":30,"is_student":false,"languages":["C++","Python","JavaScript"],"name":"Alice"}
反序列化(JSON -> C++ 對象
反序列化是將 JSON 字符串解析為 Json::Value
對象,以便在 C++ 中訪問其內容。我們可以使用 Json::Reader
或 Json::CharReader
來解析 JSON 字符串。
#include <iostream>
#include <json/json.h>int main() {// 假設我們有一個 JSON 字符串std::string jsonString = "{\"name\":\"Alice\",\"age\":30,\"is_student\":false,\"languages\":[\"C++\",\"Python\",\"JavaScript\"]}";// 創建一個 Json::Value 對象Json::Value root;Json::CharReaderBuilder readerBuilder;std::string errs;// 使用 CharReader 解析 JSON 字符串std::istringstream iss(jsonString);if (!parseFromStream(readerBuilder, iss, &root, &errs)) {std::cerr << "Failed to parse JSON: " << errs << std::endl;return -1;}// 訪問 JSON 數據std::string name = root["name"].asString();int age = root["age"].asInt();bool isStudent = root["is_student"].asBool();// 獲取數組Json::Value languages = root["languages"];std::cout << "Deserialized JSON:" << std::endl;std::cout << "Name: " << name << std::endl;std::cout << "Age: " << age << std::endl;std::cout << "Is Student: " << (isStudent ? "Yes" : "No") << std::endl;std::cout << "Languages: ";for (unsigned int i = 0; i < languages.size(); ++i) {std::cout << languages[i].asString() << " ";}std::cout << std::endl;return 0;
}
反序列化結果:
Deserialized JSON:
Name: Alice
Age: 30
Is Student: No
Languages: C++ Python JavaScript
5. 總結
- 序列化 :通過
Json::Value
構建 JSON 對象,并使用Json::FastWriter
或Json::StreamWriter
將其轉換為 JSON 字符串。 - 反序列化 :通過
Json::Reader
或Json::CharReader
將 JSON 字符串解析為Json::Value
對象,然后可以通過asString()
、asInt()
等方法訪問數據。
JsonCpp
是一個非常方便的庫,適合在 C++ 項目中處理 JSON 數據。