【库链接】https://github.com/Stiffstream/json_dto
【库链接】 GitCode - 全球开发者的开源社区,开源代码托管平台

JSON-DTO: C++ JSON 序列化/反序列化库
json_dto 是一个轻量级的 C++14 库,用于简化 JSON 数据与 C++ 对象之间的序列化和反序列化转换(Data Transfer Object 模式)。它提供了一种方便的方法来将C++结构体或类实例转换为JSON格式的数据,并且可以从JSON数据创建C++对象实例。json_dto 库设计上注重易用性和性能,适用于需要在C++应用程序中处理JSON数据的各种场景。
以下是关于 JSON-DTO 的详细介绍和使用指南。
主要特性
-
简单易用:通过简单的宏定义即可实现对象与 JSON 的转换
-
类型安全:编译时类型检查
-
无外部依赖:仅需 C++14 标准库
-
高性能:基于 RapidJSON 实现高效解析
-
支持嵌套对象:可以处理复杂的对象层次结构
-
灵活性:支持多种C++数据类型,包括但不限于基本数据类型、STL容器(如vector, list, map等)、以及自定义类型的序列化和反序列化。
-
错误处理:提供了详细的错误信息,便于调试过程中快速定位问题所在。
基本用法
1. 定义可序列化的 DTO 类
#include <json_dto/pub.hpp>
struct person
{
std::string name;
int age;
bool is_active;
// 定义反射元数据
template<typename JSON_IO>
void json_io(JSON_IO & io)
{
io & json_dto::mandatory("name", name)
& json_dto::mandatory("age", age)
& json_dto::optional("is_active", is_active, true); // 默认值
}
};
2. 序列化对象到 JSON
person p{"John Doe", 30, true};
// 转换为 JSON 字符串
const auto json_str = json_dto::to_json(p);
// 结果: {"name":"John Doe","age":30,"is_active":true}
3. 从 JSON 反序列化对象
const std::string json_data = R"json(
{"name":"Alice Smith","age":25}
)json";
// 从 JSON 创建对象
auto p = json_dto::from_json<person>(json_data);
// is_active 使用默认值 true
高级功能
1. 处理可选字段
struct config
{
std::string host;
std::uint16_t port;
std::optional<std::string> auth_token; // C++17 optional
template<typename JSON_IO>
void json_io(JSON_IO & io)
{
io & json_dto::mandatory("host", host)
& json_dto::mandatory("port", port)
& json_dto::optional_no_default("auth_token", auth_token);
}
};
2. 处理嵌套对象
struct address
{
std::string street;
std::string city;
template<typename JSON_IO>
void json_io(JSON_IO & io) { ... }
};
struct employee
{
person info;
address location;
std::vector<std::string> skills;
template<typename JSON_IO>
void json_io(JSON_IO & io)
{
io & json_dto::mandatory("info", info)
& json_dto::mandatory("location", location)
& json_dto::mandatory("skills", skills);
}
};
3. 自定义类型转换
namespace json_dto
{
template<typename T>
void read_json_value(const rapidjson::Value & from, std::optional<T> & to)
{
if(!from.IsNull())
{
T temp;
read_json_value(from, temp);
to = std::move(temp);
}
else
{
to = std::nullopt;
}
}
} // namespace json_dto
性能优化技巧
-
重用 JSON 文档:避免重复解析
rapidjson::Document doc; json_dto::from_json(doc, json_str); auto obj1 = json_dto::from_json<my_type>(doc); auto obj2 = json_dto::from_json<other_type>(doc);
-
使用 string_view:减少字符串拷贝
void from_string(std::string_view json_str) { auto obj = json_dto::from_json<my_type>(json_str); } -
预分配内存:对于已知大小的容器
struct high_perf { std::vector<double> data; template<typename JSON_IO> void json_io(JSON_IO & io) { if(io.is_serializing()) { io & json_dto::mandatory("data", data); } else { data.reserve(1024); // 预分配 io & json_dto::mandatory("data", data); } } };
与其他库的比较
| 特性 | JSON-DTO | nlohmann/json | RapidJSON | Boost.JSON |
|---|---|---|---|---|
| 易用性 | 高 (DTO模式) | 非常高 | 低 | 中等 |
| 性能 | 高 | 中等 | 非常高 | 高 |
| 内存占用 | 低 | 高 | 非常低 | 中等 |
| C++标准要求 | C++14 | C++11 | C++03 | C++17 |
| 头文件大小 | 小 | 大 | 小 | 大 |
JSON-DTO 特别适合需要高性能且数据结构相对固定的场景,如网络通信、配置文件解析等。
849

被折叠的 条评论
为什么被折叠?



