nlohmann::json(常简称 json.hppNlohmann JSON)是一个开源的、现代 C++ JSON 处理库,由德国开发者 Niels Lohmann 创建。它是 C++ 中最受欢迎的 JSON 库之一,专为 C++11 及更高版本设计,旨在让 JSON 操作像处理原生 C++ 类型(如 std::string、std::vector)一样自然和高效。截至 2025 年 11 月 4 日,其最新版本是 v3.12.0(于 2025 年 4 月 11 日发布)。

这个库的核心是 nlohmann::json 类(一个模板类),它将 JSON 值抽象为 C++ 对象,支持解析(parse)、序列化(serialize)、操作(manipulate)和验证(validate)。它不是一个“重量级”框架,而是单头文件库(只需包含一个 json.hpp 文件),集成简单、无需外部依赖(如 Boost),适合嵌入式、ROS2、游戏开发等场景。

1. 主要特性

nlohmann::json 的设计哲学是“JSON 像 C++ 原生类型一样使用”,通过 operator overloading(操作符重载)实现无缝集成。关键特性包括:

  • 全面 JSON 支持
    • 解析/生成:从字符串、文件、流读取 JSON;反之序列化为字符串/文件。
    • 数据类型:支持 JSON 的 6 种基本类型(null、boolean、number、string、array、object),映射到 C++ 的 std::nullptr_t、bool、double、std::string、std::vector<json>、std::map<std::string, json>。
    • 扩展格式:从 v3.11 开始支持 UBJSON(二进制 JSON)和 JSON Merge Patch(RFC 7386)。
  • 易用 API
    • 访问如数组/对象:json["key"] 或 json[0]。
    • 迭代:for (auto& item : json)。
    • 序列化:std::cout << json.dump(4);(带缩进)。
    • 验证:自动检查类型(如 json.at("key").get<std::string>() 抛异常如果不匹配)。
  • 性能与安全
    • SAX(Streaming API for XML-like parsing):低内存解析大文件。
    • 异常安全:默认抛 json::exception 处理错误。
    • 无外部依赖:纯 C++,编译快(单文件 ~500KB)。
  • 现代 C++ 特性
    • 支持 C++20 modules(从 v3.12.0 优化)。
    • Forward declarations 头文件:避免大项目中重复编译。

用表格总结核心特性对比其他库(如 RapidJSON、jsoncpp):

特性 nlohmann::json RapidJSON jsoncpp
集成方式 单头文件 多文件/CMake 多文件/CMake
C++ 标准 C++11+ C++98+ C++03+
性能 高(DOM 式) 极高(SAX) 中等
易用性 极高(operator magic) 中等
大小 中等
2. 如何使用(简单示例)

下载:从 GitHub Releases 下载 json.hpp(或用包管理器如 apt install nlohmann-json3-dev)。

示例代码(读取/操作 JSON):

cpp

#include <iostream>
#include <fstream>
#include "json.hpp"  // 或 <nlohmann/json.hpp> 如果系统安装

using json = nlohmann::json;

int main() {
    // 解析字符串
    json j = json::parse(R"({"name": "Grok", "age": 1, "hobbies": ["AI", "Coding"]})");

    // 访问/修改
    std::cout << "Name: " << j["name"] << std::endl;  // 输出: Name: Grok
    j["age"] = 2;  // 修改
    j["active"] = true;  // 添加

    // 序列化
    std::cout << j.dump(4) << std::endl;  // 美化输出

    // 从文件读取
    std::ifstream file("data.json");
    json j_file;
    file >> j_file;  // 直接解析

    return 0;
}

编译:g++ -std=c++11 main.cpp -o main。

3. 优势与缺点
  • 优势
    • 直观:JSON 操作像 C++ 容器(e.g., j["array"][0])。
    • 社区活跃:GitHub 星数 >30k,文档丰富(json.nlohmann.me)。
    • 跨平台:Windows/Linux/Mac,支持 ROS2/FastDDS 等。
  • 缺点
    • DOM 式:全加载内存,不如 SAX 适合超大文件(>GB)。
    • 版本兼容:重大更新(如 v3.11)需检查 breaking changes。
    • 二进制大小:模板实例化后稍大(但优化好)。
4. 安装与资源
  • 安装
    • 系统包:Ubuntu sudo apt install nlohmann-json3-dev。
    • CMake:find_package(nlohmann_json REQUIRED)。
    • vcpkg/Conan:vcpkg install nlohmann-json。
  • 资源

总之,nlohmann::json 是 C++ JSON 处理的“黄金标准”,适合从简单脚本到生产级应用。如果你有具体使用问题(如 ROS2 集成),我可以帮写代码!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐