Published on

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

Authors

🌟 为什么选择 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 支持两种模式:

  1. 压缩模式: serialize(root, -1),去除多余空格,适合网络传输。
  2. 美化模式: 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++ 的严谨逻辑与动态语言的便捷体验并非鱼与熊掌,通过合理的抽象,二者可以兼得。


项目链接地址: https://github.com/e2hang/JsonParser