AIGCJson 库介绍与使用指南
目录
概述
什么是 AIGCJson?
AIGCJson 是一个轻量级、仅包含头文件的 C++ 库,提供了 C++ 类与 JSON 之间的无缝转换。它提供了一种简单直观的方式,用于将 C++ 对象序列化为 JSON 字符串,并将 JSON 字符串反序列化为 C++ 对象,所需代码和配置最少。
AIGCJson 通过一种非侵入式、基于宏的方法 ,弥合了 C++ 代码与 JSON 数据交换格式之间的差距。该库围绕 RapidJSON 构建,提供了一个开发者友好的接口,极大地简化了在 C++ 应用程序中处理 JSON 的工作。
设计理念
AIGCJson 以提升开发者生产力为设计目标:
- 简单易用:最少代码,最大便利
- 类型安全:编译期类型检查,运行时类型验证
- 零依赖:仅依赖 RapidJSON(头文件库)
- 高性能:基于 RapidJSON 的高性能解析引擎
- 功能完整:支持基本类型、容器、嵌套结构、继承等
项目信息
- 作者:Yaronzz (yaronhuang@foxmail.com)
- 许可证:MIT License
- GitHub:https://github.com/yaronzz
- 版本:1.0.3
- 依赖:RapidJSON(头文件库)
核心特性
1. 广泛的类型支持
AIGCJson 支持以下数据类型:
| 类型分类 | 支持的类型 |
|---|---|
| 基本类型 | int, uint, short, ushort, int64_t, uint64_t, bool, float, double, std::string |
| 容器类型 | std::vector<T>, std::list<T>, std::set<T>, std::unordered_set<T> |
| 映射类型 | std::map<std::string, T>, std::unordered_map<std::string, T> |
| 自定义类型 | 任意结构体/类(通过 AIGC_JSON_HELPER 注册) |
| 枚举类型 | 任意枚举类型(自动转换为 int) |
2. 极简代码
只需两行代码即可在对象和 JSON 之间转换:
cpp
struct User {
std::string name;
int age;
bool is_vip;
// 一行宏定义,完成所有序列化逻辑
AIGC_JSON_HELPER(name, age, is_vip);
};
// 使用示例
User user;
JsonHelper::JsonToObject(user, jsonStr); // JSON → 对象
JsonHelper::ObjectToJson(user, jsonStr); // 对象 → JSON
3. 高级功能
- 成员重命名:C++ 成员名与 JSON 字段名可以不同
- 默认值支持:为缺失字段设置默认值
- 继承支持:正确处理基类和派生类的序列化
- 嵌套对象:支持任意深度的嵌套结构
- 错误处理:详细的错误信息,便于调试
4. 零运行时开销
- 基于模板元编程,编译期展开
- 无反射机制,无运行时类型信息
- 类型检查在编译期和运行时双重验证
快速开始
安装
AIGCJson 是仅包含头文件的库,占用空间极小。你只需要:
- 包含
AIGCJson.hpp的include文件夹 - 包含
rapidjson子文件夹 - 将头文件路径添加到项目的包含路径
- 包含头文件即可开始使用
cpp
#include "AIGCJson.hpp"
using namespace std;
using namespace aigc;
💡 专业提示 :AIGCJson 占用空间极小------你只需要包含
AIGCJson.hpp的include文件夹和rapidjson子文件夹。只需将其添加到项目的包含路径,即可开始使用!
基础示例
示例 1:基本结构体序列化(快速示例)
以下是一个简单的示例,演示如何使用 AIGCJson:
cpp
#include "AIGCJson.hpp"
using namespace std;
using namespace aigc;
// 定义你的类
class Student {
public:
string Name;
int Age;
// 使用 JSON 助手注册成员
AIGC_JSON_HELPER(Name, Age)
};
int main() {
// 将 JSON 反序列化为对象
Student person;
JsonHelper::JsonToObject(person, R"({"Name":"XiaoMing", "Age":15})");
// 将对象序列化为 JSON
string jsonStr;
JsonHelper::ObjectToJson(person, jsonStr);
// jsonStr 将包含: {"Name":"XiaoMing","Age":15}
return 0;
}
只需几行代码,你就可以在 C++ 对象和 JSON 之间转换,而无需编写任何自定义序列化逻辑。
示例 2:容器类型
cpp
struct Team {
string team_name;
vector<string> members; // 字符串数组
map<string, int> scores; // 键值对映射
AIGC_JSON_HELPER(team_name, members, scores);
};
int main() {
string jsonStr = R"({
"team_name": "Alpha Team",
"members": ["Alice", "Bob", "Charlie"],
"scores": {
"Alice": 95,
"Bob": 88,
"Charlie": 92
}
})";
Team team;
JsonHelper::JsonToObject(team, jsonStr);
cout << "团队: " << team.team_name << endl;
cout << "成员: ";
for (const auto& member : team.members) {
cout << member << " ";
}
cout << endl;
return 0;
}
示例 3:嵌套结构
cpp
struct Address {
string city;
string street;
int zip_code;
AIGC_JSON_HELPER(city, street, zip_code);
};
struct User {
string name;
int age;
Address address; // 嵌套结构
AIGC_JSON_HELPER(name, age, address);
};
int main() {
string jsonStr = R"({
"name": "Bob",
"age": 25,
"address": {
"city": "Beijing",
"street": "Chang'an Avenue",
"zip_code": 100000
}
})";
User user;
JsonHelper::JsonToObject(user, jsonStr);
cout << "用户: " << user.name << endl;
cout << "地址: " << user.address.city << ", " << user.address.street << endl;
return 0;
}
详细功能
工作原理
AIGCJson 使用基于宏的注册方法,在 C++ 类成员和 JSON 属性之间创建双向映射。这种方法消除了其他 JSON 库中常见的复杂反射系统或代码生成步骤的需求。
该库通过其模板元编程实现,处理类型转换、嵌套对象、容器和继承的复杂细节。
关键概念
AIGCJson 引入了一些核心概念,使在 C++ 中处理 JSON 变得简单:
| 特性 | 描述 | 实现 |
|---|---|---|
| 成员注册 | 将 C++ 类成员映射到 JSON 属性 | AIGC_JSON_HELPER(member1, member2) |
| 成员重命名 | 将 C++ 成员重命名为不同的 JSON 属性名称 | AIGC_JSON_HELPER_RENAME("json_name1", "json_name2") |
| 基类支持 | 处理类层次结构中的继承 | AIGC_JSON_HELPER_BASE((BaseClass*)this) |
| 默认值 | 为缺失的 JSON 属性设置回退值 | AIGC_JSON_HELPER_DEFAULT(member1=value1) |
这些概念通过模板元编程和宏实现,提供了一个简洁、声明式的 API。
1. 成员重命名(AIGC_JSON_HELPER_RENAME)
当 JSON 字段名与 C++ 成员名不同时,可以使用重命名功能:
cpp
struct User {
string name;
int age;
AIGC_JSON_HELPER(name, age)
// JSON 字段名映射:name → "user_name", age → "user_age"
AIGC_JSON_HELPER_RENAME("user_name", "user_age")
};
// JSON: {"user_name": "Alice", "user_age": 20}
// 解析后:name = "Alice", age = 20
2. 默认值设置(AIGC_JSON_HELPER_DEFAULT)
为可能缺失的字段设置默认值:
cpp
struct Config {
string server_url;
int port = 8080; // C++ 默认值
bool enable_ssl = false; // C++ 默认值
int timeout = 30;
AIGC_JSON_HELPER(server_url, port, enable_ssl, timeout)
// 通过宏设置默认值(会覆盖 C++ 默认值)
AIGC_JSON_HELPER_DEFAULT(port=8080, enable_ssl=false, timeout=30)
};
// JSON: {"server_url": "https://example.com"}
// 解析结果:
// - server_url = "https://example.com"
// - port = 8080 (使用默认值)
// - enable_ssl = false (使用默认值)
// - timeout = 30 (使用默认值)
3. 继承支持(AIGC_JSON_HELPER_BASE)
正确处理基类和派生类的序列化:
cpp
struct Base {
string base_name;
int base_id;
AIGC_JSON_HELPER(base_name, base_id);
};
struct Derived : public Base {
string derived_name;
int derived_value;
AIGC_JSON_HELPER(derived_name, derived_value)
// 注册基类成员
AIGC_JSON_HELPER_BASE((Base*)this)
};
// JSON: {
// "base_name": "Base",
// "base_id": 1,
// "derived_name": "Derived",
// "derived_value": 100
// }
4. 路径解析
支持从 JSON 的指定路径解析对象:
cpp
string jsonStr = R"({
"data": {
"user": {
"name": "Alice",
"age": 20
}
}
})";
User user;
// 从 "data.user" 路径解析
vector<string> path = {"data", "user"};
JsonHelper::JsonToObject(user, jsonStr, path);
5. 错误处理
获取详细的错误信息:
cpp
User user;
string jsonStr = R"({"name": "Alice", "age": "invalid"})";
string errorMsg;
if (!JsonHelper::JsonToObject(user, jsonStr, {}, &errorMsg)) {
cout << "解析失败: " << errorMsg << endl;
// 输出: 解析失败: [age] json-value is string but object is int.
}
使用场景
AIGCJson 适用于:
- 配置管理:解析和生成 JSON 格式的配置文件
- API 通信:处理来自 Web API 的 JSON 响应
- 数据存储:序列化对象以供持久化存储和后续检索
- 数据交换:使用 JSON 作为交换格式在不同系统之间共享数据
该库的简洁性和灵活性使其适用于各种规模的项目,从小型工具到大型应用程序。
详细使用示例
1. 配置文件解析
cpp
struct AppConfig {
string app_name;
string log_level;
int max_connections;
vector<string> allowed_hosts;
AIGC_JSON_HELPER(app_name, log_level, max_connections, allowed_hosts);
};
// 从配置文件加载
ifstream configFile("config.json");
string configJson((istreambuf_iterator<char>(configFile)),
istreambuf_iterator<char>());
AppConfig config;
JsonHelper::JsonToObject(config, configJson);
2. API 响应解析
cpp
struct ApiResponse {
int code;
string message;
map<string, string> data;
AIGC_JSON_HELPER(code, message, data);
};
// 解析 HTTP 响应
string responseJson = httpClient.get("/api/user/123");
ApiResponse response;
JsonHelper::JsonToObject(response, responseJson);
3. 数据持久化
cpp
struct GameSave {
string player_name;
int level;
int score;
vector<string> inventory;
AIGC_JSON_HELPER(player_name, level, score, inventory);
};
// 保存游戏数据
GameSave save;
save.player_name = "Player1";
save.level = 10;
save.score = 5000;
string jsonStr;
JsonHelper::ObjectToJson(save, jsonStr);
ofstream saveFile("save.json");
saveFile << jsonStr;
4. 消息协议
cpp
struct Message {
string type;
string from;
string to;
string content;
int64_t timestamp;
AIGC_JSON_HELPER(type, from, to, content, timestamp);
};
// 序列化消息
Message msg;
msg.type = "text";
msg.from = "user1";
msg.to = "user2";
msg.content = "Hello!";
msg.timestamp = time(nullptr);
string jsonStr;
JsonHelper::ObjectToJson(msg, jsonStr);
// 发送 JSON 字符串
与其他库对比
AIGCJson vs RapidJSON
| 特性 | AIGCJson | RapidJSON |
|---|---|---|
| 易用性 | ⭐⭐⭐⭐⭐ 一行宏定义 | ⭐⭐ 需要手写解析代码 |
| 类型安全 | ⭐⭐⭐⭐⭐ 编译期+运行时检查 | ⭐⭐⭐ 运行时检查 |
| 性能 | ⭐⭐⭐⭐⭐ 基于 RapidJSON | ⭐⭐⭐⭐⭐ 原生高性能 |
| 功能 | ⭐⭐⭐⭐ 常用功能完整 | ⭐⭐⭐⭐⭐ 功能最全 |
| 学习曲线 | ⭐⭐⭐⭐⭐ 极低 | ⭐⭐ 需要学习 API |
适用场景:
- AIGCJson:快速开发、结构体序列化、配置文件解析
- RapidJSON:性能极致要求、复杂 JSON 操作、需要精细控制
AIGCJson vs nlohmann/json
| 特性 | AIGCJson | nlohmann/json |
|---|---|---|
| 易用性 | ⭐⭐⭐⭐⭐ 宏定义 | ⭐⭐⭐⭐ 自动推导 |
| 依赖 | RapidJSON(头文件) | 无依赖 |
| 性能 | ⭐⭐⭐⭐⭐ 基于 RapidJSON | ⭐⭐⭐⭐ 良好 |
| 编译速度 | ⭐⭐⭐⭐ 较快 | ⭐⭐⭐ 较慢(模板多) |
| C++ 标准 | C++11+ | C++11+ |
适用场景:
- AIGCJson:需要高性能、已有 RapidJSON 依赖
- nlohmann/json:需要零依赖、更现代的 API
AIGCJson vs 其他方案
| 方案 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| 手写解析 | 完全控制、性能最优 | 代码量大、易出错 | ⭐⭐ |
| 代码生成 | 类型安全、性能好 | 需要工具链、维护成本 | ⭐⭐⭐ |
| 反射库 | 自动序列化 | 运行时开销、依赖重 | ⭐⭐⭐ |
| AIGCJson | 简单、高效、类型安全 | 功能相对有限 | ⭐⭐⭐⭐⭐ |
最佳实践
1. 设置合理的默认值
cpp
struct Config {
string server_url; // 必填字段,不设默认值
int port = 8080; // 可选字段,设置默认值
bool enable_cache = true; // 可选字段,设置默认值
AIGC_JSON_HELPER(server_url, port, enable_cache);
};
2. 检查解析结果
cpp
User user;
string jsonStr = "...";
string errorMsg;
if (!JsonHelper::JsonToObject(user, jsonStr, {}, &errorMsg)) {
// 记录错误并处理
LOG_ERROR("JSON 解析失败: %s", errorMsg.c_str());
return false;
}
// 解析成功,使用 user 对象
3. 字段顺序考虑
将关键字段放在前面,这样即使后续字段解析失败,关键数据也能正确解析:
cpp
struct User {
string id; // ✅ 关键字段在前
string name; // ✅ 关键字段在前
int age = 0; // 可选字段
string email; // 可选字段
AIGC_JSON_HELPER(id, name, age, email);
};
4. 使用 const 引用避免拷贝
cpp
// ✅ 推荐:使用 const 引用
void processUser(const User& user) {
// ...
}
// ❌ 不推荐:值传递(大对象会拷贝)
void processUser(User user) {
// ...
}
5. 错误信息处理
cpp
string errorMsg;
if (!JsonHelper::JsonToObject(obj, jsonStr, {}, &errorMsg)) {
// errorMsg 包含详细错误信息,如:
// "[age] json-value is string but object is int."
// 可以根据错误信息进行针对性处理
}
6. 嵌套结构设计
cpp
// ✅ 推荐:合理的嵌套层次(2-3 层)
struct User {
string name;
Address address; // 嵌套一层
AIGC_JSON_HELPER(name, address);
};
// ⚠️ 注意:过深的嵌套可能影响可读性
常见问题
Q1: AIGCJson 支持哪些 C++ 标准?
A : 支持 C++11 及更高版本。使用了模板元编程、std::enable_if、可变参数模板等 C++11 特性。
Q2: 如何处理可选字段?
A: 有几种方式:
- 设置默认值(推荐):
cpp
struct User {
string name;
int age = 0; // 默认值
AIGC_JSON_HELPER(name, age);
};
- 使用
std::optional(需要自定义处理):
cpp
// 需要扩展 AIGCJson 支持 optional
- 字段缺失时保持默认值:
cpp
// JSON 中不包含该字段时,使用 C++ 初始化值
Q3: 性能如何?
A: AIGCJson 基于 RapidJSON,性能与 RapidJSON 相当。序列化/反序列化开销主要来自:
- JSON 解析(RapidJSON 负责)
- 类型转换(编译期优化)
- 内存分配(可优化)
对于大多数应用场景,性能完全足够。
Q4: 支持自定义类型转换吗?
A : 可以扩展 JsonHelperPrivate 类,添加自定义类型的 JsonToObject 和 ObjectToJson 重载:
cpp
// 扩展 AIGCJson 支持自定义类型
namespace aigc {
// 自定义类型转换
bool JsonToObject(MyCustomType& obj, rapidjson::Value& jsonValue) {
// 自定义转换逻辑
return true;
}
}
Q5: 如何处理 null 值?
A : 参考 AIGCJson 库解析行为与异常处理指南:
string类型:null 解析为空字符串""- 其他基本类型:null 会导致解析失败
- 结构体类型:null 时所有字段保持默认值
Q6: 能否序列化私有成员?
A: 可以,但需要提供访问接口:
cpp
class User {
private:
string name;
int age;
public:
// 提供访问接口
const string& getName() const { return name; }
void setName(const string& n) { name = n; }
// 使用访问接口注册
AIGC_JSON_HELPER(getName, setName, age); // 需要扩展支持
};
或者使用友元函数(更复杂,不推荐)。
Q7: 支持 JSON 数组的根对象吗?
A : 支持,使用 vector 或 list:
cpp
// JSON: [{"name":"Alice"}, {"name":"Bob"}]
vector<User> users;
JsonHelper::JsonToObject(users, jsonStr);
Q8: 如何处理枚举类型?
A : 枚举类型自动转换为 int:
cpp
enum class Status { Active, Inactive, Pending };
struct Record {
Status status;
AIGC_JSON_HELPER(status);
};
// JSON: {"status": 0} // 0 = Active
总结
核心优势
- 极简 API:一行宏定义完成序列化
- 类型安全:编译期和运行时双重检查
- 高性能:基于 RapidJSON 的高性能引擎
- 功能完整:支持常用数据类型和高级特性
- 零学习成本:API 直观,文档清晰
适用场景
- ✅ 配置文件解析
- ✅ API 响应处理
- ✅ 数据持久化
- ✅ 消息协议序列化
- ✅ 快速原型开发
不适用场景
- ❌ 需要复杂 JSON 操作(使用 RapidJSON 原生 API)
- ❌ 需要动态 JSON 结构(使用
nlohmann/json) - ❌ 需要极致性能优化(手写解析代码)
快速参考
cpp
// 1. 定义结构体
struct MyStruct {
string field1;
int field2;
AIGC_JSON_HELPER(field1, field2);
};
// 2. 反序列化
MyStruct obj;
JsonHelper::JsonToObject(obj, jsonStr);
// 3. 序列化
string jsonStr;
JsonHelper::ObjectToJson(obj, jsonStr);
相关文档
- AIGCJson 库解析行为与异常处理指南 - 详细的解析规则和异常处理
- RapidJSON 官方文档 - 底层 JSON 库文档
文档创建时间:2026-01-10
基于 AIGCJson v1.0.3 源码分析整理