跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++

nlohmann/json 详解:现代 C++ 的 JSON 处理方案

介绍 nlohmann/json 库,涵盖安装、核心功能、进阶用法及典型场景。该库为单头文件 C++ JSON 库,支持强类型安全、跨平台及高性能操作。内容包括数据类型映射、对象操作、序列化反序列化、JSON 指针、自定义类型转换、错误处理及性能优化技巧。适用于配置文件解析、REST API 交互及数据持久化。

Elasticer发布于 2026/3/23更新于 2026/5/721 浏览

一、概述:为什么选择 nlohmann/json?

nlohmann/json 是由德国程序员 Niels Lohmann 开发的一个开源 C++ JSON 库,自 2013 年发布以来,因其极简的 API 设计、零依赖的头文件库特性,以及完整的现代 C++ 支持,迅速成为 C++ 社区中最受欢迎的 JSON 库(GitHub 星标超 38k)。相较于传统 JSON 库(如 JsonCpp),它具有以下革命性优势:

  1. 强类型安全:提供 at() 安全访问、类型检查 API
  2. 跨平台:支持 Windows/Linux/macOS 及嵌入式系统
  3. 高性能:比 JsonCpp 快 2 倍以上(官方基准测试)

直觉式语法:操作 JSON 像写 JavaScript 一样自然

j["user"]["name"] = "Alice"; // 链式访问

适用场景:配置文件解析、REST API 交互、数据序列化存储
慎用场景:GB 级 JSON 处理(推荐 simdjson)


二、安装指南

nlohmann/json 是单头文件库(single-header),只需包含 json.hpp 即可使用。同时支持主流包管理器:

安装方式对比表
平台/工具安装命令项目集成方式
通用(手动)下载 json.hpp#include <nlohmann/json.hpp>
Linux (apt)sudo apt install nlohmann-json3-dev自动链接
Windows (vcpkg)vcpkg install nlohmann-jsontarget_link_libraries(... nlohmann-json)
macOS (Homebrew)brew install nlohmann-json自动链接
CMake (通用)find_package(nlohmann_json REQUIRED)target_link_libraries(... nlohmann_json::nlohmann_json)

推荐使用 CMake 集成确保版本兼容性


三、核心功能详解

1. 数据类型映射(无缝转换)
JSON 类型C++ 类型示例代码
objectstd::map/std::unordered_mapj = {{"key", "value"}};
arraystd::vector/std::listj = {1, 2, 3};
stringstd::stringj = "Hello";
numberint/double/floatj = 3.14;
booleanboolj = true;
nullnullptrj = nullptr;
2. JSON 对象操作(创建/访问/修改)
// 创建复杂 JSON 结构
json j = {
    {"name", "Alice"},
    {"scores", {95, 88.5, 100}},
    {"metadata", {{"id", "A001"}, {"valid", true}}}
};

// 安全访问(避免异常)
std::string name = j.value("name", "Unknown"); // 带默认值
int mathScore = j.at("scores").at(0); // 链式安全访问

// 动态修改
j["scores"][1] = 90.0; // 修改数组元素
j["metadata"]["tags"] = {"top"}; // 新增字段
3. 序列化与反序列化
// 对象 → JSON 字符串
std::string jsonStr = j.dump(4); // 缩进 4 空格美化

// JSON 字符串 → 对象
auto j2 = json::parse(R"( { "device": "Sensor01", "values": [23.4, 18.9] } )");

// 文件交互
std::ofstream file("data.json");
file << j; // 写入文件

std::ifstream inFile("data.json");
inFile >> j2; // 从文件读取

四、进阶用法

1. 嵌套结构与 JSON 指针
json config = {
    {"server", {
        {"ip", "192.168.1.1"},
        {"ports", {8080, 8000}}
    }}
};

// 使用 JSON Pointer 访问深层数据
std::string ip = config[json_pointer("/server/ip")];
int mainPort = config[json_pointer("/server/ports/0")];

// 安全修改嵌套数据
if(config.contains("server") && config["server"].is_object()){
    config["server"]["timeout"] = 30; // 添加超时设置
}
2. 自定义类型转换(实战示例)
struct Employee {
    int id;
    std::string name;
    std::vector<std::string> skills;
};

// 序列化适配
void to_json(json& j, const Employee& e) {
    j = json{{"emp_id", e.id}, {"full_name", e.name}, {"competencies", e.skills}};
}

// 反序列化适配
void from_json(const json& j, Employee& e) {
    j.at("emp_id").get_to(e.id);
    j.at("full_name").get_to(e.name);
    j.at("competencies").get_to(e.skills);
}

// 使用示例
Employee bob {101, "Bob", {"C++", "Linux"}};
json j_bob = bob; // 自动序列化
Employee bob_copy = j_bob.get<Employee>(); // 自动反序列化
3. 错误处理最佳实践
try {
    json j = json::parse(invalidJson);
    int value = j.at("key").get<int>();
} catch (json::parse_error& e) {
    std::cerr << "Parse error: " << e.what() << '\n';
} catch (json::out_of_range& e) {
    std::cerr << "Key error: " << e.what() << '\n';
} catch (json::type_error& e) {
    std::cerr << "Type error: " << e.what() << '\n';
}
4. 性能优化关键技巧
// 技巧 1:预分配数组空间
json::array_t largeArray;
largeArray.reserve(10000); // 预分配内存
j["big_data"] = std::move(largeArray); // 移动语义

// 技巧 2:流式解析(SAX 模式)
struct StatsCollector : nlohmann::json_sax<json> {
    bool key(std::string& key) override {
        keys.insert(key);
        return true;
    }
    std::set<std::string> keys;
};
StatsCollector handler;
json::sax_parse(bigJsonData, handler); // 不构建完整 DOM

// 技巧 3:禁用异常(嵌入式场景)
#define JSON_NOEXCEPTION // 禁用异常
j.contains("key"); // 使用返回值检查
5. JSON Patch 动态修改
// 原始 JSON
json doc = {
    {"name", "John"},
    {"age", 30}
};

// 创建修改指令
json patch = {
    {"op", "replace", "path", "/age", "value", 31},
    {"op", "add", "path", "/city", "value", "London"}
};

// 应用 Patch
json patched = doc.patch(patch);
/* 结果:
{ "name": "John", "age": 31, "city": "London" }
*/

五、典型应用场景

1. 配置文件解析
json config;
try {
    std::ifstream configFile("config.json");
    configFile >> config;
} catch (...) {
    // 加载失败则用默认配置
    config = {
        {"port", 8080},
        {"debug", true}
    };
}
const int port = config.value("port", 80);
const bool debug = config.value("debug", false);
2. REST API 客户端
// 发送 HTTP 请求获取 JSON
auto res = httplib::Client("api.example.com").Get("/users/123");
if(res && res->status == 200) {
    json user = json::parse(res->body);
    // 使用 JSON Path 查询嵌套数据
    auto email = user.value("contact.email", "[email protected]");
    auto lastLogin = user[json_pointer("/activity/last_login")];
}
3. 数据持久化存储
struct SensorReadings {
    std::string id;
    std::vector<float> values; // ... 其他字段
};

// 对象转 JSON 存储
SensorReadings data = get_sensor_data();
json archive = data; // 自动序列化
std::ofstream outFile("data_log.json", std::ios::app);
outFile << archive.dump() << '\n';

// 从文件恢复对象
std::ifstream in("data_log.json");
std::string line;
while(std::getline(in, line)) {
    auto j = json::parse(line);
    SensorReadings restored = j.get<SensorReadings>();
}

六、结语

nlohmann/json 通过精心设计的 API 和对现代 C++ 特性的深度应用,彻底解决了 C++ 处理 JSON 数据的痛点。其仅头文件的特性使得集成成本几乎为零,而强大的功能集能满足从简单配置解析到复杂数据转换的各种需求。

官方文档:JSON for Modern C++
完整代码示例:GitHub Repository

主流 JSON 库对比
特性nlohmann/jsonRapidJSONJsonCpp
头文件库✅✅❌
C++11 语法支持✅❌❌
异常安全✅⚠️✅
自定义类型转换✅❌⚠️
JSON Patch 支持✅❌❌
二进制格式支持✅ (CBOR/MessagePack)⚠️❌

升级建议:使用包管理器锁定版本(如 vcpkg install nlohmann-json:[email protected]),并通过 CI/CD 定期更新。

扩展阅读:

  • 官方 FAQ
  • 性能优化深度指南
  • 与 C++20 的协程集成示例

目录

  1. 一、概述:为什么选择 nlohmann/json?
  2. 二、安装指南
  3. 安装方式对比表
  4. 三、核心功能详解
  5. 1. 数据类型映射(无缝转换)
  6. 2. JSON 对象操作(创建/访问/修改)
  7. 3. 序列化与反序列化
  8. 四、进阶用法
  9. 1. 嵌套结构与 JSON 指针
  10. 2. 自定义类型转换(实战示例)
  11. 3. 错误处理最佳实践
  12. 4. 性能优化关键技巧
  13. 5. JSON Patch 动态修改
  14. 五、典型应用场景
  15. 1. 配置文件解析
  16. 2. REST API 客户端
  17. 3. 数据持久化存储
  18. 六、结语
  19. 主流 JSON 库对比
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 堆排序算法原理与实现
  • 基于 OpenClaw 和飞书搭建 7x24 小时服务器运维机器人
  • Docker 与 Ollama 本地部署 DeepSeek 大模型实战
  • Stable Diffusion 本地部署与使用教程
  • Git Config 核心配置详解:层级、命令与避坑
  • 基于遗传算法与 RBF 神经网络的无人机故障容错控制仿真
  • OpenClaw 与 Ollama 本地部署指南
  • 使用 Frontend-Design Skill 提升大模型前端设计能力
  • STM32CubeMX、Keil MDK、Git 及 VS Code 统一 UTF-8 编码配置指南
  • Python 自动化测试工具 Selenium 核心详解与实战
  • Python 中不易察觉的有趣事实与底层机制解析
  • 金仓数据库 SQL 防火墙:SQL 注入拦截原理与性能测试
  • 鸿蒙金融理财全栈项目:生态合作、用户运营与数据变现
  • Docker 安装部署全流程使用指南(Linux 通用版)
  • 2025 年度技术总结:从代码入门到 AI 赋能的成长之路
  • Python 代码打包为 EXE 完整指南与问题排查
  • 深入理解链表结构与 Java LinkedList 实现
  • 夸克网盘精选资源汇总:电子书、软件与学习素材
  • Vue 警告 Duplicate keys detected 重复键报错排查与解决
  • AI 大模型落地基础:提示词、Agent 与工具调用详解

相关免费在线工具

  • 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