C++中的JSON处理:nlohmann/json库用于数据处理

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

使用 nlohmann/json 库在 C++ 中处理 JSON



在现代 C++ 开发中,处理 JSON(JavaScript Object Notation)已成为创建 Web 服务、配置文件以及系统间数据交换不可或缺的一部分。完成此任务最流行且方便的库之一是 nlohmann/json(或简称 JSON for Modern C++)。它提供了直观的 API、极简的语法和高性能。在本文中,我们将详细介绍如何使用此库在 C++ 中解析、创建、修改和序列化 JSON 数据。



安装与包含

nlohmann/json 库是 header-only(仅由头文件组成)。要安装它,只需从 官方仓库 下载一个文件 json.hpp 并将其包含到项目中:



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


如果您使用 CMake,可以通过 FetchContent 或 vcpkg 包含该库。CMake 示例:



FetchContent_Declare(json    GIT_REPOSITORY https://github.com/nlohmann/json.git    GIT_TAG v3.11.2)FetchContent_MakeAvailable(json)

target_link_libraries(your_project PRIVATE nlohmann_json::nlohmann_json)


库的主要功能

  • 从字符串或文件解析 JSON – 将文本转换为结构化数据。
  • 创建 JSON 对象 – 使用运算符 [] 和方法动态构建结构。
  • 数据访问 – 通过键和索引读取值,并进行类型检查。
  • 序列化 – 将 JSON 对象转换回带格式的字符串。
  • 处理数组和嵌套对象 – 支持复杂的层次结构。
  • 错误处理 – 在数据或类型不正确时抛出异常。


示例 1:解析和读取数据

让我们看一个简单的例子:我们有一个包含用户信息的 JSON 字符串。解析它并提取值:



#include <iostream>#include <nlohmann/json.hpp>

using json = nlohmann::json;

int main() { std::string json_str = R"( { "name": "Иван", "age": 30, "is_student": false, "hobbies": ["чтение", "программирование", "спорт"] } )";

// 将字符串解析为 json 对象 json user = json::parse(json_str);

// 访问数据并进行类型检查 std::string name = user["name"]; int age = user["age"]; bool is_student = user["is_student"];

std::cout << "Имя: " << name << std::endl; std::cout << "Возраст: " << age << std::endl; std::cout << "Студент: " << (is_student ? "да" : "нет") << std::endl;

// 处理数组 auto& hobbies = user["hobbies"]; std::cout << "Хобби: "; for (const auto& hobby : hobbies) { std::cout << hobby << " "; } std::cout << std::endl;

return 0;}


示例 2:创建和序列化 JSON

通常需要以编程方式构建 JSON 结构。以下代码创建一个包含书籍数据的对象,并以格式化形式输出:



#include <iostream>#include <nlohmann/json.hpp>

using json = nlohmann::json;

int main() { // 创建一个空对象 json book;

// 填充数据 book["title"] = "Война и мир"; book["author"] = "Лев Толстой"; book["year"] = 1869; book["genres"] = {"роман", "историческая литература"};

// 嵌套对象 book["publisher"]["name"] = "Эксмо";

推荐