AIGCJson 库介绍与使用指南

AIGCJson 库介绍与使用指南

目录

  1. 概述
  2. 核心特性
  3. 快速开始
  4. 详细功能
  5. 使用场景
  6. 与其他库对比
  7. 最佳实践
  8. 常见问题
  9. 总结

概述

什么是 AIGCJson?

AIGCJson 是一个轻量级、仅包含头文件的 C++ 库,提供了 C++ 类与 JSON 之间的无缝转换。它提供了一种简单直观的方式,用于将 C++ 对象序列化为 JSON 字符串,并将 JSON 字符串反序列化为 C++ 对象,所需代码和配置最少

AIGCJson 通过一种非侵入式、基于宏的方法,弥合了 C++ 代码与 JSON 数据交换格式之间的差距。该库围绕 RapidJSON 构建,提供了一个开发者友好的接口,极大地简化了在 C++ 应用程序中处理 JSON 的工作。

设计理念

AIGCJson 以提升开发者生产力为设计目标:

  • 简单易用:最少代码,最大便利
  • 类型安全:编译期类型检查,运行时类型验证
  • 零依赖:仅依赖 RapidJSON(头文件库)
  • 高性能:基于 RapidJSON 的高性能解析引擎
  • 功能完整:支持基本类型、容器、嵌套结构、继承等

项目信息

  • 作者:Yaronzz ([email protected])
  • 许可证: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 之间转换:

structUser{ 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 是仅包含头文件的库,占用空间极小。你只需要:

  1. 包含 AIGCJson.hppinclude 文件夹
  2. 包含 rapidjson 子文件夹
  3. 将头文件路径添加到项目的包含路径
  4. 包含头文件即可开始使用
#include"AIGCJson.hpp"usingnamespace std;usingnamespace aigc;
💡 专业提示:AIGCJson 占用空间极小——你只需要包含 AIGCJson.hppinclude 文件夹和 rapidjson 子文件夹。只需将其添加到项目的包含路径,即可开始使用!

基础示例

示例 1:基本结构体序列化(快速示例)

以下是一个简单的示例,演示如何使用 AIGCJson:

#include"AIGCJson.hpp"usingnamespace std;usingnamespace aigc;// 定义你的类classStudent{public: string Name;int Age;// 使用 JSON 助手注册成员AIGC_JSON_HELPER(Name, Age)};intmain(){// 将 JSON 反序列化为对象 Student person;JsonHelper::JsonToObject(person,R"({"Name":"XiaoMing", "Age":15})");// 将对象序列化为 JSON string jsonStr;JsonHelper::ObjectToJson(person, jsonStr);// jsonStr 将包含: {"Name":"XiaoMing","Age":15}return0;}

只需几行代码,你就可以在 C++ 对象和 JSON 之间转换,而无需编写任何自定义序列化逻辑。

示例 2:容器类型
structTeam{ string team_name; vector<string> members;// 字符串数组 map<string,int> scores;// 键值对映射AIGC_JSON_HELPER(team_name, members, scores);};intmain(){ 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(constauto& member : team.members){ cout << member <<" ";} cout << endl;return0;}
示例 3:嵌套结构
structAddress{ string city; string street;int zip_code;AIGC_JSON_HELPER(city, street, zip_code);};structUser{ string name;int age; Address address;// 嵌套结构AIGC_JSON_HELPER(name, age, address);};intmain(){ 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;return0;}

详细功能

工作原理

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++ 成员名不同时,可以使用重命名功能:

structUser{ 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)

为可能缺失的字段设置默认值:

structConfig{ 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)

正确处理基类和派生类的序列化:

structBase{ string base_name;int base_id;AIGC_JSON_HELPER(base_name, base_id);};structDerived:publicBase{ 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 的指定路径解析对象:

string jsonStr =R"({ "data": { "user": { "name": "Alice", "age": 20 } } })"; User user;// 从 "data.user" 路径解析 vector<string> path ={"data","user"};JsonHelper::JsonToObject(user, jsonStr, path);

5. 错误处理

获取详细的错误信息:

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. 配置文件解析

structAppConfig{ 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 响应解析

structApiResponse{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. 数据持久化

structGameSave{ 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. 消息协议

structMessage{ 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

特性AIGCJsonRapidJSON
易用性⭐⭐⭐⭐⭐ 一行宏定义⭐⭐ 需要手写解析代码
类型安全⭐⭐⭐⭐⭐ 编译期+运行时检查⭐⭐⭐ 运行时检查
性能⭐⭐⭐⭐⭐ 基于 RapidJSON⭐⭐⭐⭐⭐ 原生高性能
功能⭐⭐⭐⭐ 常用功能完整⭐⭐⭐⭐⭐ 功能最全
学习曲线⭐⭐⭐⭐⭐ 极低⭐⭐ 需要学习 API

适用场景

  • AIGCJson:快速开发、结构体序列化、配置文件解析
  • RapidJSON:性能极致要求、复杂 JSON 操作、需要精细控制

AIGCJson vs nlohmann/json

特性AIGCJsonnlohmann/json
易用性⭐⭐⭐⭐⭐ 宏定义⭐⭐⭐⭐ 自动推导
依赖RapidJSON(头文件)无依赖
性能⭐⭐⭐⭐⭐ 基于 RapidJSON⭐⭐⭐⭐ 良好
编译速度⭐⭐⭐⭐ 较快⭐⭐⭐ 较慢(模板多)
C++ 标准C++11+C++11+

适用场景

  • AIGCJson:需要高性能、已有 RapidJSON 依赖
  • nlohmann/json:需要零依赖、更现代的 API

AIGCJson vs 其他方案

方案优点缺点推荐度
手写解析完全控制、性能最优代码量大、易出错⭐⭐
代码生成类型安全、性能好需要工具链、维护成本⭐⭐⭐
反射库自动序列化运行时开销、依赖重⭐⭐⭐
AIGCJson简单、高效、类型安全功能相对有限⭐⭐⭐⭐⭐

最佳实践

1. 设置合理的默认值

structConfig{ string server_url;// 必填字段,不设默认值int port =8080;// 可选字段,设置默认值bool enable_cache =true;// 可选字段,设置默认值AIGC_JSON_HELPER(server_url, port, enable_cache);};

2. 检查解析结果

User user; string jsonStr ="..."; string errorMsg;if(!JsonHelper::JsonToObject(user, jsonStr,{},&errorMsg)){// 记录错误并处理LOG_ERROR("JSON 解析失败: %s", errorMsg.c_str());returnfalse;}// 解析成功,使用 user 对象

3. 字段顺序考虑

关键字段放在前面,这样即使后续字段解析失败,关键数据也能正确解析:

structUser{ string id;// ✅ 关键字段在前 string name;// ✅ 关键字段在前int age =0;// 可选字段 string email;// 可选字段AIGC_JSON_HELPER(id, name, age, email);};

4. 使用 const 引用避免拷贝

// ✅ 推荐:使用 const 引用voidprocessUser(const User& user){// ...}// ❌ 不推荐:值传递(大对象会拷贝)voidprocessUser(User user){// ...}

5. 错误信息处理

string errorMsg;if(!JsonHelper::JsonToObject(obj, jsonStr,{},&errorMsg)){// errorMsg 包含详细错误信息,如:// "[age] json-value is string but object is int."// 可以根据错误信息进行针对性处理}

6. 嵌套结构设计

// ✅ 推荐:合理的嵌套层次(2-3 层)structUser{ string name; Address address;// 嵌套一层AIGC_JSON_HELPER(name, address);};// ⚠️ 注意:过深的嵌套可能影响可读性

常见问题

Q1: AIGCJson 支持哪些 C++ 标准?

A: 支持 C++11 及更高版本。使用了模板元编程、std::enable_if、可变参数模板等 C++11 特性。

Q2: 如何处理可选字段?

A: 有几种方式:

  1. 设置默认值(推荐):
structUser{ string name;int age =0;// 默认值AIGC_JSON_HELPER(name, age);};
  1. 使用 std::optional(需要自定义处理):
// 需要扩展 AIGCJson 支持 optional
  1. 字段缺失时保持默认值
// JSON 中不包含该字段时,使用 C++ 初始化值

Q3: 性能如何?

A: AIGCJson 基于 RapidJSON,性能与 RapidJSON 相当。序列化/反序列化开销主要来自:

  • JSON 解析(RapidJSON 负责)
  • 类型转换(编译期优化)
  • 内存分配(可优化)

对于大多数应用场景,性能完全足够。

Q4: 支持自定义类型转换吗?

A: 可以扩展 JsonHelperPrivate 类,添加自定义类型的 JsonToObjectObjectToJson 重载:

// 扩展 AIGCJson 支持自定义类型namespace aigc {// 自定义类型转换boolJsonToObject(MyCustomType& obj, rapidjson::Value& jsonValue){// 自定义转换逻辑returntrue;}}

Q5: 如何处理 null 值?

A: 参考 AIGCJson 库解析行为与异常处理指南

  • string 类型:null 解析为空字符串 ""
  • 其他基本类型:null 会导致解析失败
  • 结构体类型:null 时所有字段保持默认值

Q6: 能否序列化私有成员?

A: 可以,但需要提供访问接口:

classUser{private: string name;int age;public:// 提供访问接口const string&getName()const{return name;}voidsetName(const string& n){ name = n;}// 使用访问接口注册AIGC_JSON_HELPER(getName, setName, age);// 需要扩展支持};

或者使用友元函数(更复杂,不推荐)。

Q7: 支持 JSON 数组的根对象吗?

A: 支持,使用 vectorlist

// JSON: [{"name":"Alice"}, {"name":"Bob"}] vector<User> users;JsonHelper::JsonToObject(users, jsonStr);

Q8: 如何处理枚举类型?

A: 枚举类型自动转换为 int

enumclassStatus{ Active, Inactive, Pending };structRecord{ Status status;AIGC_JSON_HELPER(status);};// JSON: {"status": 0} // 0 = Active

总结

核心优势

  1. 极简 API:一行宏定义完成序列化
  2. 类型安全:编译期和运行时双重检查
  3. 高性能:基于 RapidJSON 的高性能引擎
  4. 功能完整:支持常用数据类型和高级特性
  5. 零学习成本:API 直观,文档清晰

适用场景

  • ✅ 配置文件解析
  • ✅ API 响应处理
  • ✅ 数据持久化
  • ✅ 消息协议序列化
  • ✅ 快速原型开发

不适用场景

  • ❌ 需要复杂 JSON 操作(使用 RapidJSON 原生 API)
  • ❌ 需要动态 JSON 结构(使用 nlohmann/json
  • ❌ 需要极致性能优化(手写解析代码)

快速参考

// 1. 定义结构体structMyStruct{ string field1;int field2;AIGC_JSON_HELPER(field1, field2);};// 2. 反序列化 MyStruct obj;JsonHelper::JsonToObject(obj, jsonStr);// 3. 序列化 string jsonStr;JsonHelper::ObjectToJson(obj, jsonStr);

相关文档


文档创建时间:2026-01-10
基于 AIGCJson v1.0.3 源码分析整理

Read more

Flutter 三方库 webfeed 的鸿蒙化适配指南 - 掌控 RSS/Atom 内容订阅、XML 语义分发实战、鸿蒙级精密聚合专家

Flutter 三方库 webfeed 的鸿蒙化适配指南 - 掌控 RSS/Atom 内容订阅、XML 语义分发实战、鸿蒙级精密聚合专家

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 webfeed 的鸿蒙化适配指南 - 掌控 RSS/Atom 内容订阅、XML 语义分发实战、鸿蒙级精密聚合专家 在鸿蒙跨平台应用执行高级内容聚合与多维资讯资产指控(如构建一个支持全场景自动发现的鸿蒙阅读器、处理海量 RSS 2.0/Atom 协议的语义认领或是实现一个具备极致指控能力的资产管理快报中控)时,如果依赖繁琐的原始 XML 解析或是不透明的正文提取算法,极易在处理“命名空间(Namespace)冲突导致的字段丢失”、“非标准日期格式的解析崩溃”或“多模式 Feed 协议间的字段映射偏移”时陷入研发逻辑崩溃死循环。如果你追求的是一种完全对齐现代 Web 聚合标准、支持全量语义解析且具备极致指控确定性的方案。今天我们要深度解析的 webfeed——一个专注于解决“分发内容标准化认领”痛点的顶级工具库,正是帮你打造“鸿蒙超感阅读内核”

他到底喜欢我吗?赛博塔罗Java+前端实现,一键解答!

他到底喜欢我吗?赛博塔罗Java+前端实现,一键解答!

个人主页-爱因斯晨 文章专栏-赛博算命 原来我们在已往的赛博算命系列文章中的源码已经传到我的Github仓库中,有兴趣的家人们可以自己运行查看。 Github 源码中的一些不足,还恳请业界大佬们批评指正! 本文章的源码已经打包至资源绑定,仓库中也同步更新。 一、引言 在数字化浪潮席卷全球的当下,传统塔罗牌占卜这一古老智慧也迎来了新的表达形式 ——“赛博塔罗”。本文档旨在深入剖析塔罗牌的核心原理,并详细介绍如何利用 Java 语言实现一个简易的塔罗牌预测程序,展现传统神秘学与现代编程技术的融合。 二、塔罗牌原理 (一)集体潜意识与原型理论 瑞士心理学家卡尔・荣格提出的 “集体潜意识” 理论,为塔罗牌的运作提供了重要的心理学支撑。该理论认为,人类拥有超越个体经验的共同心理结构,其中蕴含着 “原型”—— 即普遍存在的、象征性的模式或形象。 塔罗牌的 22 张大阿尔卡那牌恰好与这些基本原型相对应。例如,“愚人” 代表着天真与新开始的原型,“魔术师” 象征着创造力与潜能的原型,“女祭司” 则体现了智慧与直觉的原型。这些原型是全人类共通的心理元素,这也正是不同文化背景的人都能

聊聊天 AI 自己能干活!影刀 6.0 解锁化学资讯整理新姿势

聊聊天 AI 自己能干活!影刀 6.0 解锁化学资讯整理新姿势

谁懂啊!想从化学专业网页扒取资讯标题和链接,还要按主题分类生成带时间戳的 PDF或HTML,放在以前得敲半天代码、调无数参数,现在和影刀 RPA6.0 聊聊天,电脑直接自己把活干完了,甚至报错都能自动解决,这 AI 自动化也太香了!✨ 作为常年和各类化学资讯打交道的人,日常需要从专业化工网页提取信息、分类整理并归档,重复的操作不仅耗时,还容易因为细节出错。直到试了影刀 RPA6.0 的全新 AI 功能,才发现原来自动化可以这么简单 —— 不用学编程,不用搭复杂流程,只需要用自然语言把需求说清楚,剩下的全交给 AI 就够了。 这次我的需求很明确:访问这个化学资讯网页,抓取页面所有咨询的标题和对应链接,按照我关注的化学主题按相似度自动分类,最后将结果保存到电脑桌面,以当前年月日时分秒命名为 PDF或HTML 文件。原本以为会遇到元素定位失败、分类逻辑混乱、文件命名出错等问题,没想到影刀 6.0 的 AI 能力直接把这些难题全解决了!

基于ModelEngine快速搭建AI智能体,打造你的专属旅行顾问

基于ModelEngine快速搭建AI智能体,打造你的专属旅行顾问

大家好,我是herosunly。985院校硕士毕业,现担任算法工程师一职,获得ZEEKLOG博客之星第一名,热衷于大模型算法的研究与应用。曾担任百度千帆AI应用挑战赛、英特尔AI创新应用大赛等比赛评委,科大讯飞AI大学堂荣誉讲师,编写微软OpenAI考试认证指导手册。曾获得多项AI顶级比赛的Top名次,其中包括阿里云天池比赛第一名,科大讯飞分类挑战赛第一名。在技术创新领域拥有多项授权发明。 本文详细介绍了基于ModelEngine快速搭建AI智能体,打造你的专属旅行顾问,希望能对搭建AI智能体的同学们有所帮助。 文章目录 * 1. 前言:打造更懂你的“智能旅行助手” * 1.1 思考:从导航进化为向导 * 1.2 破局:华为 ModelEngine 的可视化方案 * 2. 环境准备与应用初始化 * 2.1 平台登录与入口 * 2.2 创建应用 * 2.3 智能生成框架 * 3. 核心能力配置 * 3.1 提示词优化 * 3.2