尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

xpack基础用法详解:XPACK宏与encode/decode手把手教学

xpack基础用法详解:XPACK宏与encode/decode手把手教学 xpack基础用法详解XPACK宏与encode/decode手把手教学【免费下载链接】xpackconvert json/xml/bson to c struct项目地址: https://gitcode.com/gh_mirrors/xp/xpack一句话认识 xpack它是一个纯头文件的 C 库帮你轻松实现 JSON/XML/BSON 与 C 结构体之间的互相转换。本文围绕xpack 基础用法展开手把手教你使用XPACK 宏绑定结构体字段再通过encode/decode完成序列化与反序列化让新手也能快速上手。无论你是做网络通信、配置文件解析还是数据存储这套C 序列化方案都能显著减少你的样板代码。 xpack 是什么C 程序员为什么需要它在 C 项目里把结构体转成 JSON 或把 JSON 转回结构体通常需要手写大量解析代码字段一多就非常痛苦。xpack的出现正是为了解决这个痛点✅纯头文件无需编译库文件、无需 Makefile拷进去就能用✅ 支持JSON / XML / YAML / BSON还支持 MySQL、SQLite 数据源✅ 只需在结构体末尾加一行XPACK 宏即可自动生成编解码逻辑✅ 容器友好vector、list、set、map、shared_ptr开箱即用核心源码入口不多看这几个文件就够了入口头文件 json.h、宏定义核心 xpack.h以及完整的官方文档 README.md。 快速上手三分钟搭建你的第一个 xpack 项目一键安装纯头文件库的引入方法xpack 无需安装只要把整个项目目录放到你的工程中并在源码里包含对应头文件即可#include xpack/json.h // 操作 JSON 包含它 #include xpack/xml.h // 操作 XML 则包含它编译时加上头文件路径-I指向项目根目录即可参考示例工程 example/makefileg -o demo demo.cpp -stdc11 -I ../../xpack最简示例XPACK 宏与 encode/decode 的第一次亲密接触下面这段代码就是 xpack 的全部核心强烈建议亲手跑一遍#include iostream #include xpack/json.h using namespace std; struct User { int id; string name; XPACK(O(id, name)); // XPACK 宏绑定字段 }; int main() { User u; string data {\id\:12345, \name\:\xpack\}; xpack::json::decode(data, u); // JSON - 结构体 cout u.id ; u.name endl; string json xpack::json::encode(u); // 结构体 - JSON cout json endl; return 0; }输出结果一目了然decode把字符串解析进结构体encode再把它序列化回 JSON 字符串。完整可运行代码见 example/encoder.cpp。 XPACK 宏详解结构体字段绑定的核心语法XPACK 宏是 xpack 的灵魂。它的写法是XPACK(字母(字段...))其中字母代表不同功能字母含义示例O普通字段无特殊标记XPACK(O(id, name))X带 FLAG 的字段XPACK(X(F(OE), id))M必填字段缺失抛异常XPACK(M(id))A别名字段名与 key 不同XPACK(A(uid, id))B位域字段XPACK(B(F(0), ver, len))I继承的父类XPACK(I(Base1, Base2))E枚举非 C11 环境XPACK(E(F(0), e))C自定义编解码XPACK(C(mycodec, F(0), b))O 与 X最常用的两种写法O(a, b)等价于X(F(0), a, b)表示字段无特殊 FLAG日常最常用X(F(flag...), ...)适合需要给单个字段附加 FLAG 的场景常用 FLAG 速查表FLAG作用OEencode 时值为 0/空串/false 则不输出该字段ENencode 时空值输出为null仅 JSONMdecode 时字段缺失则抛异常适合 id 等关键字段ATTRXML encode 时输出为属性attributeSLJSON encode 时数组字段单行输出 encode/decode 手把手进阶从 JSON 到 XML 的通用玩法玩法一嵌套结构体与容器xpack 支持结构体嵌套和标准容器这是业务中最常见的需求struct Score { int math; int english; XPACK(O(math, english)); }; struct Student { string name; vectorint scores; mapstring, string attrs; XPACK(O(name, scores, attrs)); };vector、map、list、set、shared_ptr等都直接支持无需额外配置。玩法二一行代码切换 XMLxpack 的接口设计高度统一换格式只需换头文件和命名空间#include xpack/xml.h Student s; xpack::xml::decode(xmlStr, s); // XML - 结构体 string xml xpack::xml::encode(s); // 结构体 - XML同样地BSON 支持见 bson.hYAML 支持见 yaml.h。玩法三格式化输出让人读的 JSON默认encode输出无缩进适合程序间传输如果需要给人看可以指定缩进参数// 参数indentCount 缩进字符数indentChar 缩进字符空格/制表符 string json xpack::json::encode(u, 0, 2, );玩法四别名让字段名与 key 解耦接口返回的字段名和结构体变量名不一致是常态用A别名轻松解决struct Test { long uid; string name; XPACK(A(uid, id), O(name)); // 结构体 uid 对应 JSON 中的 id };更进阶的用法如json:_id类型级别名、XML 数组标签控制等都收录在官方文档 README.md 的「别名」章节。 进阶特性速览继承、枚举与自定义编解码继承用I(P1, P2)声明父类父类同样需要 XPACK 宏参考 example/inherit.cpp枚举C11 下枚举可直接放进O/X/A老编译器用E参考 example/enum.cpp自定义编解码两种方式——类型级xtype参考 example/xtype.cpp和字段级C(...)参考 example/custom.cpp可实现时间格式化为字符串、union 处理等高级需求不定类型JSON schema 不确定时用xpack::JsonData动态接收参考 example/json-data.cpp❓ 常见问题 FAQQ1xpack 需要 C11 吗基础功能不强制但shared_ptr、unordered_map等容器需要 C11 支持MSVC 建议使用 2019 及以上版本。Q2能处理第三方库的结构体吗可以。用XPACK_OUT宏在全局命名空间声明即可官方示例就是用它对struct timeval做的扩展详见 README.md 的「第三方类和结构体」章节。Q3变量名有什么讲究避免使用__x_pack开头的变量名以免与库内部实现冲突。 总结xpack 用极低的成本解决了 C 中最繁琐的结构化数据序列化问题一行XPACK 宏完成字段绑定encode/decode统一处理多格式转换。从今天的xpack 基础用法出发你已经掌握了 90% 的日常场景剩下的高级玩法都可以在 example 示例目录里找到答案。赶紧动手试一下吧【免费下载链接】xpackconvert json/xml/bson to c struct项目地址: https://gitcode.com/gh_mirrors/xp/xpack创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表