- Published on
【开源项目】E2hangJson: 基于 C++20 的高性能 JSON 解析与序列化库
- Authors

- Name
- E2hang
- https://info.huajishe.fun/
🌟 为什么选择 E2hangJson?
在 C++ 环境下处理 JSON 往往意味着繁琐的类型转换。E2hangJson 的诞生是为了在追求 高性能 的同时,赋予开发者类似 Python 的 灵活性。
- 现代 C++20 驱动: 利用
std::source_location等特性实现精准的错误回溯。 - 直观的 API: 支持链式操作,像写脚本语言一样操作 C++ 数据结构。
- 工业级鲁棒性: 内置详细的错误报告(行、列、字节偏移),告别“莫名其妙”的解析失败。
🚀 快速上手
只需要几行代码,即可完成从对象构建到序列化的全过程。
基础示例
#include "JsonParser.h"
#include "JsonSerializer.h"
#include <iostream>
int main() {
// 1. 像操作字典一样构建 JSON 对象
JsonValue root(JsonValue::Type::Map);
root["project"] = "E2hangJson";
root["version"] = 1.0;
root["features"].push_back("Fast Parsing");
root["features"].push_back("C++20 Ready");
// 2. 序列化(支持自定义缩进美化)
std::string jsonStr = JsonSerializer::serialize(root, 4);
// 3. 解析字符串并提取数据
JsonParser parser(jsonStr);
try {
JsonValue parsed = parser.parse();
std::cout << "Project: " << parsed["project"].asString() << std::endl;
} catch (const JsonError& e) {
std::cerr << "Parse Error: " << e.to_string() << std::endl;
}
return 0;
}
📂 核心架构与深度设计
E2hangJson 在内部实现上追求极致的简洁与解耦,主要分为三个核心模块:
1. 数据表示层 (JsonValue)
JsonValue 是库的核心类。为了在 C++ 中模拟动态类型,我们采用了类似 std::variant 的存储模式。
- 内存优化: 针对小对象进行了优化,减少频繁的内存申请。
- 链式访问: 通过重载
operator[],你可以实现类似root["users"][0]["name"]的深度嵌套访问。
2. 解析引擎 (JsonParser)
采用 手工编写的递归下降算法 (Recursive Descent),相比正则或状态机,这种方式更易于调试和扩展。
- Unicode 支持: 完美处理
\uXXXX格式的转义字符。 - 零拷贝思想: 在解析大字符串时,尽量通过指针偏移而非字符串拷贝来提高吞吐量。
3. 异常处理机制 (JsonError)
这是本项目的一大亮点。当解析失败时,系统会抛出 JsonError,提供:
- 错误类型(语法错误、未闭合的括号等)。
- 坐标定位: 精确到行号、列号以及绝对字节偏移。
🛠 进阶特性
类型安全提取
库提供了严谨的类型检查,防止在处理外部输入时发生运行时崩溃:
if (val.is_map() && val.contains("status")) {
auto status = val["status"].asString();
}
序列化策略
JsonSerializer 支持两种模式:
- 压缩模式:
serialize(root, -1),去除多余空格,适合网络传输。 - 美化模式:
serialize(root, 4),自动换行缩进,适合配置文件阅读。
⚙️ 编译与集成
项目遵循现代 C++ 最佳实践,易于集成:
- 要求: C++20 标准。
- 兼容性:
- MSVC: 请务必使用
/utf-8编译选项。 - GCC/Clang: 完整支持。
命令行快速编译 (MSVC):
cl /I./include /O2 /std:c++20 /utf-8 /EHsc /DJSON_LIBRARY_EXPORT src/*.cpp /LD /Fe:E2hangJson.dll
📄 开源协议与贡献
本项目采用 MIT License。我们欢迎任何形式的 PR、Bug 反馈或功能建议。
最后寄语: E2hangJson 旨在证明:C++ 的严谨逻辑与动态语言的便捷体验并非鱼与熊掌,通过合理的抽象,二者可以兼得。