Linux 45: JSON序列化与反序列化实战
·
🔥个人主页:Milestone-里程碑
❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>
🌟心向往之行必能至
目录
2.1. 使⽤ Json::Value 的 toStyledString ⽅法:
3.2. 使⽤ Json::CharReader 的派⽣类(不推荐了,上⾯的⾜够了):
我们知道,我们要自定义协议,而这里面的序列化和反序列化,我们就可以通过Jsoncpp实现
一.Jsoncpp
Jsoncpp 是⼀个⽤于处理 JSON 数据的 C++ 库。它提供了将 JSON 数据序列化为字符串以及从字符串
反序列化为 C++ 数据结构的功能。Jsoncpp 是开源的,⼴泛⽤于各种需要处理 JSON 数据的 C++ 项⽬中。
特性
1. 简单易⽤:Jsoncpp 提供了直观的 API,使得处理 JSON 数据变得简单。2. ⾼性能:Jsoncpp 的性能经过优化,能够⾼效地处理⼤量 JSON 数据。3. 全⾯⽀持:⽀持 JSON 标准中的所有数据类型,包括对象、数组、字符串、数字、布尔值和 null。4. 错误处理:在解析 JSON 数据时,Jsoncpp 提供了详细的错误信息和位置,⽅便开发者调试。当使⽤Jsoncpp库进⾏JSON的序列化和反序列化时,确实存在不同的做法和⼯具类可供选择。以下是对Jsoncpp中序列化和反序列化操作的详细介绍:安装ubuntu : sudo apt-get install libjsoncpp-devCentos: sudo yum install jsoncpp-devel
注意:编译时,需要显示指定链接Jsoncpp库
二.序列化
序列化指的是将数据结构或对象转换为⼀种格式,以便在⽹络上传输或存储到⽂件中。Jsoncpp提供了多种⽅式进⾏序列化:
2.1. 使⽤ Json::Value 的 toStyledString ⽅法:
◦
优点:将 Json::Value 对象直接转换为格式化的JSON字符串。
◦
⽰例:
#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>
int main()
{
Json::Value root;
root["name"] = "joe";
root["sex"] = "男";
std::string s = root.toStyledString();
std::cout << s << std::endl;
return 0;
}
结果
{
"name" : "joe",
"sex" : "\u7537"
}
2.2 使⽤ Json::StreamWriter :
◦
优点:提供了更多的定制选项,如缩进、换⾏符等。
◦
⽰例:
#include <iostream>
#include <string>
#include <sstream>
#include <memory>
#include <jsoncpp/json/json.h>
int main()
{
Json::Value root;
root["name"] = "joe";
root["sex"] = "男";
Json::StreamWriterBuilder wbuilder; // StreamWriter的⼯⼚
std::unique_ptr<Json::StreamWriter>
writer(wbuilder.newStreamWriter());
std::stringstream ss;
writer->write(root, &ss);
std::cout << ss.str() << std::endl;
return 0;
}
{
"name" : "joe",
"sex" : "男"
}
2.3. 使⽤ Json::FastWriter :
◦ 优点:⽐ StyledWriter 更快,因为它不添加额外的空格和换⾏符。
◦ ⽰例:
#include <iostream>
#include <string>
#include <sstream>
#include <memory>
#include <jsoncpp/json/json.h>
int main()
{
Json::Value root;
root["name"] = "joe";
root["sex"] = "男";
Json::FastWriter writer;
std::string s = writer.write(root);
std::cout << s << std::endl;
return 0;
}
#include <iostream>
#include <string>
#include <sstream>
#include <memory>
#include <jsoncpp/json/json.h>
int main()
{
Json::Value root;
root["name"] = "joe";
root["sex"] = "男";
// Json::FastWriter writer;
Json::StyledWriter writer;
std::string s = writer.write(root);
std::cout << s << std::endl;
return 0;
}
{
"name" : "joe",
"sex" : "男"
}
三.反序列化
反序列化指的是将序列化后的数据重新转换为原来的数据结构或对象。Jsoncpp提供了以下⽅法进⾏
反序列化:
3.1. 使⽤ Json::Reader :
◦
优点:提供详细的错误信息和位置,⽅便调试。
◦
⽰例:
代码块
#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>
int main() {
// JSON 字符串
std::string json_string = "{\"name\":\"张三\", \"age\":30,
\"city\":\"北京\"}";
// 解析 JSON 字符串
Json::Reader reader;
Json::Value root;
// 从字符串中读取 JSON 数据
bool parsingSuccessful = reader.parse(json_string, root);
if (!parsingSuccessful) {
// 解析失败,输出错误信息
std::cout << "Failed to parse JSON: " <<
reader.getFormattedErrorMessages() << std::endl;
return 1;
}
// 访问 JSON 数据
std::string name = root["name"].asString();
int age = root["age"].asInt();
std::string city = root["city"].asString();
// 输出结果
std::cout << "Name: " << name << std::endl;
std::cout << "Age: " << age << std::endl;
std::cout << "City: " << city << std::endl;
return 0;
}
结果
Name: 张三
Age: 30
City: 北京
3.2. 使⽤ Json::CharReader 的派⽣类(不推荐了,上⾯的⾜够了):
◦ 在某些情况下,你可能需要更精细地控制解析过程,可以直接使⽤ Json::CharReader 的派⽣类。◦ 但通常情况下,使⽤ Json::parseFromStream 或 Json::Reader 的 parse ⽅法就⾜够了。总结toStyledString 、 StreamWriter 和 FastWriter 提供了不同的序列化选项,你可以根据具体需求选择使⽤。Json::Reader 和 parseFromStream 函数是Jsoncpp中主要的反序列化⼯具,它们提供了强⼤的错误处理机制。• 在进⾏序列化和反序列化时,请确保处理所有可能的错误情况,并验证输⼊和输出的有效性。Json::ValueJson::Value 是 Jsoncpp 库中的⼀个重要类,⽤于表⽰和操作 JSON 数据结构。以下是⼀些常⽤的 Json::Value 操作列表:1. 构造函数• Json::Value() :默认构造函数,创建⼀个空的 Json::Value 对象。• Json::Value(ValueType type, bool allocated = false) :根据给定的ValueType (如 nullValue , intValue , stringValue 等)创建⼀个Json::Value 对象。2. 访问元素• Json::Value& operator[](const char* key) :通过键(字符串)访问对象中的元素。如果键不存在,则创建⼀个新的元素。• Json::Value& operator[](const std::string& key) :同上,但使⽤std::string 类型的键。• Json::Value& operator[](ArrayIndex index) :通过索引访问数组中的元素。如果索引超出范围,则创建⼀个新的元素。• Json::Value& at(const char* key) :通过键访问对象中的元素,如果键不存在则抛出异常。• Json::Value& at(const std::string& key) :同上,但使⽤ std::string 类型的键。
3. 类型检查
• bool isNull() :检查值是否为 null。• bool isBool() :检查值是否为布尔类型。• bool isInt() :检查值是否为整数类型。• bool isInt64() :检查值是否为 64 位整数类型。• bool isUInt() :检查值是否为⽆符号整数类型。• bool isUInt64() :检查值是否为 64 位⽆符号整数类型。• bool isIntegral() :检查值是否为整数或可转换为整数的浮点数。• bool isDouble() :检查值是否为双精度浮点数。 •bool isNumeric() :检查值是否为数字(整数或浮点数)。• bool isString() :检查值是否为字符串。• bool isArray() :检查值是否为数组。• bool isObject() :检查值是否为对象(即键值对的集合)。
4. 赋值和类型转换
• Json::Value& operator=(bool value) :将布尔值赋给 Json::Value 对象。• Json::Value& operator=(int value) :将整数赋给 Json::Value 对象。• Json::Value& operator=(unsigned int value) :将⽆符号整数赋给Json::Value 对象。• Json::Value& operator=(Int64 value) :将 64 位整数赋给 Json::Value 对象。• Json::Value& operator=(UInt64 value) :将 64 位⽆符号整数赋给 Json::Value对象。• Json::Value& operator=(double value) :将双精度浮点数赋给 Json::Value 对• 象 Js 。 on::Value& operator=(const char* value) :将 C 字符串赋给 Json::Value 对象。• Json::Value& operator=(const std::string& value) :将 std::string 赋给 Json::Value 对象。• bool asBool() :将值转换为布尔类型(如果可能)。• int asInt() :将值转换为整数类型(如果可能)。• Int64 asInt64() :将值转换为 64 位整数类型(如果可能)。• unsigned int asUInt() :将值转换为⽆符号整数类型(如果可能)。• UInt64 asUInt64() :将值转换为 64 位⽆符号整数类型(如果可能)。• double asDouble() :将值转换为双精度浮点数类型(如果可能)。• std::string asString() :将值转换为字符串类型(如果可能)。
5. 数组和对象操作
• size_t size() :返回数组或对象中的元素数量。• bool empty() :检查数组或对象是否为空。• void resize(ArrayIndex newSize) :调整数组的⼤⼩。• void clear() :删除数组或对象中的所有元素。• void append(const Json::Value& value) :在数组末尾添加⼀个新元素。 •Json::Value& operator[](const char* key, const Json::Value&defaultValue = Json::nullValue) :在对象中插⼊或访问⼀个元素,如果键不存在则使⽤默认值。• Json::Value& operator[](const std::string& key, const Json::Value&defaultValue = Json::nullValue) :同上,但使⽤ std::string 类型
更多推荐




所有评论(0)