C++开发:JSON-DTO

【库链接】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 的详细介绍和使用指南。

主要特性

  1. 简单易用:通过简单的宏定义即可实现对象与 JSON 的转换

  2. 类型安全:编译时类型检查

  3. 无外部依赖:仅需 C++14 标准库

  4. 高性能:基于 RapidJSON 实现高效解析

  5. 支持嵌套对象:可以处理复杂的对象层次结构

  6. 灵活性:支持多种C++数据类型,包括但不限于基本数据类型、STL容器(如vector, list, map等)、以及自定义类型的序列化和反序列化。

  7. 错误处理:提供了详细的错误信息,便于调试过程中快速定位问题所在。

基本用法

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

性能优化技巧

  1. 重用 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-DTOnlohmann/jsonRapidJSONBoost.JSON
易用性高 (DTO模式)非常高中等
性能中等非常高
内存占用非常低中等
C++标准要求C++14C++11C++03C++17
头文件大小

JSON-DTO 特别适合需要高性能且数据结构相对固定的场景,如网络通信、配置文件解析等。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值