跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书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/9/270 浏览
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. 我的真实评价

更多推荐文章

查看全部
  • Java 算法实践:动态规划
  • FPGA 入门:基于 LED 的 2 选 1 多路选择器设计
  • FPGA 图像处理:图像畸变矫正原理及 MATLAB 与 FPGA 实现
  • LeetCode 27 题:移除元素
  • 受限内网环境下 TensorFlow 镜像拉取优化方案
  • FPGA 实现 MIPI 协议全解析与完整时序规范
  • Megick 全新体验报告2026:轻量高效的 AI 创作伙伴
  • 基于开源鸿蒙(OpenHarmony)的【智能家居综合应用】系统
  • Python 同时适配 Elasticsearch 与 Easysearch 实战复盘
  • 数据结构:单链表详解
  • FPGA 基础概念与架构面试题详解
  • SmartGit 25.1 版本更新:AI 提交信息与 Git 功能增强
  • Nano Banana AI 绘图中文模糊问题:使用 Seedream 4.5 重渲染方案
  • 「龙虾」来了!OpenClaw如何掀起AI智能体革命
  • VSCode GitHub Copilot 安装与实战指南
  • Python IDE 集成本地 DocsGPT 助手实战指南
  • 国内外主流 AI 大模型盘点与技术趋势分析
  • Flutter Genkit 组件适配鸿蒙系统:AI 流式响应与提示词工程
  • C++ 红黑树设计与实现详解
  • 即梦 AI 基础操作指南:从绘画到视频生成

相关免费在线工具

  • 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