跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++

nlohmann/json:C++ 中最像 Python 的 JSON 库

介绍 nlohmann/json 库,一个单头文件的 C++ JSON 库。它支持类似 Python 的直观语法,无需编译链接即可使用。核心特性包括原生类型映射、自定义类型序列化(通过 to_json/from_json 函数或宏)、以及基于模板元编程的架构设计。该库注重开发效率与正确性,提供 JSON Pointer、Patch 等高级功能,并经过严格测试,适合生产环境。对于需要高效处理 JSON 数据的 C++ 开发者,这是首选方案。

星河入梦发布于 2026/3/22更新于 2026/7/1246 浏览
nlohmann/json:C++ 中最像 Python 的 JSON 库

作为一个被 Spring Boot 自动配置折磨多年的 Java 老兵,第一次看到 nlohmann/json 时,我差点以为自己穿越到了 Python 世界——这真的是 C++ 能写出来的代码?

单头文件的魔法:include 即用

nlohmann/json 最震撼的地方在于它的交付方式:整个库就一个头文件 json.hpp。不需要编译、不需要链接、不用折腾 CMakeLists.txt,只要:

#include <nlohmann/json.hpp> // for convenience using json = nlohmann::json;

两行代码,搞定一切。这种"零配置"体验在 C++ 生态中堪称奢侈。对比传统 C++ 库动辄需要处理依赖、编译选项、链接错误的痛苦,nlohmann/json 简直是开发者的救星。

如果你坚持要用包管理器,它也支持 CMake 的 find_package:

find_package(nlohmann_json 3.12.0 REQUIRED)
target_link_libraries(foo PRIVATE nlohmann_json::nlohmann_json)

但说实话,直接拷贝头文件可能是最简单的方式。

像写 JSON 字面量一样写 C++ 代码

这个库的核心设计理念是:让 JSON 操作变得像原生类型一样自然。看看这个初始化代码:

// create an empty structure (null)
json j;
// add a number stored as double (note the implicit conversion of j to an object)
j["pi"] = 3.141;
// add a Boolean stored as bool
j["happy"] = true;
// add a string stored as std::string
j["name"] = "Niels";
// add another null object by passing nullptr
j["nothing"] = nullptr;
// add an object inside the object
j["answer"]["everything"] = 42;
// add an array stored as std::vector (using an initializer list)
j["list"] = { 1, 0, 2 };
// add another object (using an initializer list of pairs)
j["object"] = { {"currency", "USD"}, {"value", 42.99} };

这段代码读起来就跟看 JSON 本身一样直观!更厉害的是,它与 STL 容器无缝集成:

  • std::vector<int> → JSON 数组
  • std::map<std::string, int> → JSON 对象
  • std::list<double> → JSON 数组

这种设计充分利用了 C++11 的初始化列表和运算符重载特性,让 API 既强大又简洁。

自定义类型的自动序列化

对于复杂应用场景,nlohmann/json 提供了完美的自定义类型支持。传统做法需要为每个结构体手写序列化/反序列化逻辑,但这里只需要两个函数:

// 自定义类型转换
namespace ns {
    struct person {
        std::string name;
        std::string address;
        int age;
    };
    void to_json(json& j, const person& p) {
        j = json{{"name", p.name}, {"address", p.address}, {"age", p.age}};
    }
    void from_json(const json& j, person& p) {
        j.at("name").get_to(p.name);
        j.at("address").get_to(p.address);
        j.at("age").get_to(p.age);
    }
}

有了这两个函数,你就可以像这样使用:

person p = {"Ned Flanders", "744 Evergreen Terrace", 60};
json j = p; // 自动序列化
auto p2 = j.get<person>(); // 自动反序列化

但作者觉得这还不够懒,于是提供了宏来进一步简化:

// 使用宏简化
namespace ns {
    NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(person, name, address, age)
}

一行代码搞定!这让我想起了 Java 中的 Lombok @Data 注解,简直是生产力工具。

架构设计:模板元编程的艺术

nlohmann/json 的核心架构基于现代 C++ 的几个关键技术:

  1. 类型擦除:内部使用 std::variant(或类似的 union 实现)来存储不同类型的 JSON 值
  2. ADL(Argument-Dependent Lookup):通过命名空间查找机制自动发现用户定义的 to_json/from_json 函数
  3. SFINAE(Substitution Failure Is Not An Error):在编译期根据类型特征选择合适的序列化策略
  4. 运算符重载:重载 []、=、== 等运算符提供直观的 API

这种设计使得库既能保持高性能(避免运行时类型检查),又能提供极其灵活的扩展能力。

生产环境可靠性

作者很诚实地说,这个库不是最快的 JSON 解析器(确实有 SIMD 优化的库更快),但它追求的是开发效率和正确性。项目维护者投入了大量精力确保质量:

  • 100% 代码覆盖率
  • Valgrind 内存检查
  • Google OSS-Fuzz 24/7 模糊测试
  • 多编译器、多平台 CI 测试

这些措施确保了它在生产环境中的可靠性。不过要注意,默认的 json 类型不保留对象键的插入顺序(符合 JSON 标准),如果需要有序对象,可以使用 nlohmann::ordered_json。

高级功能:不止是基础 JSON

除了基本的序列化反序列化,nlohmann/json 还支持:

  • JSON Pointer (RFC 6901):通过路径访问嵌套数据
  • JSON Patch (RFC 6902):生成和应用差异补丁
  • JSON Merge Patch (RFC 7386):合并 JSON 文档
  • 二进制格式支持:BSON、CBOR、MessagePack

这些功能让它不仅仅是一个 JSON 库,而是一个完整的数据处理工具箱。

我的真实评价

虽然我是 Java 开发者,但如果要写 C++ 服务,nlohmann/json 绝对是我的首选。它完美平衡了易用性、功能性和可靠性。特别是对于配置文件解析、API 响应处理、数据交换等场景,它的简洁 API 能让开发效率大大提升。

更重要的是,即使你不写 C++,研究这个库的设计思路也很有价值。它展示了如何用现代 C++ 特性创造优雅的 API,以及如何在单头文件中组织复杂功能而不显得混乱。

总的来说,nlohmann/json 就是 C++ 世界的 Jackson,但它更加简洁、更加现代化。4.8 万 + 的 star 数证明了它的价值,值得每个 C++ 开发者深入了解。

目录

  1. 单头文件的魔法:include 即用
  2. 像写 JSON 字面量一样写 C++ 代码
  3. 自定义类型的自动序列化
  4. 架构设计:模板元编程的艺术
  5. 生产环境可靠性
  6. 高级功能:不止是基础 JSON
  7. 我的真实评价
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 基于腾讯云 HAI 与 DeepSeek 快速构建个人网页
  • Python 字节码逆向实战:pycdc 工具深度解析与应用
  • 开源墙绘机:双轴张力控制低成本绘图系统
  • SkyWalking Python 应用追踪:基于 skywalking-python 的埋点实战
  • 基于遗传算法的电动汽车有序充放电优化与 MATLAB 实现
  • 中国最容易和最难被 GPT 替代的职业 TOP25 分析
  • 基于高阶控制障碍函数的端到端无人机高速避障方案
  • Python 批量给图片添加文字或图片水印实战
  • LangChain Agent 基础入门:LLM 外部工具调用
  • Linux TCP 服务器开发:Echo 实现、并发优化与安全实践
  • Spring Boot 自定义注解实战:5 个高频案例详解
  • Linux 常见命令及基础知识指南
  • Stable Diffusion v2-1-base 从安装到 AI 绘画创作指南
  • 算法实战:消失的两个数字(位运算解法)
  • Java Lambda forEach 遍历中如何实现类似 break 的退出操作
  • Kotlin 面试算法实战:二叉树遍历与转换
  • Stable Diffusion 多模态大模型 LoRA 微调实战指南
  • 职场经验谈:若无必要离职原因,建议谨慎跳槽
  • Web 团队开发 App 是否应选用 Capacitor
  • 缓存算法实战:LRU 与 LFU 的 Java 实现与原理解析

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online