C++ 中的 JSON 处理:实战解析与序列化

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

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

开始课程

C++ 中的 JSON 处理:实战解析与序列化



JSON(JavaScript Object Notation)是现代应用程序中最流行的数据交换格式之一。尽管 C++ 没有内置对 JSON 的支持,但有许多库可以简化对此格式的处理。在本文中,我们将探讨使用 nlohmann/json 库(最流行且易于使用的库之一)在 C++ 中解析和序列化 JSON 的实践方面。



为什么选择 nlohmann/json?



nlohmann/json 库(通常称为 JSON for Modern C++)因其直观的 API(类似于 STL 容器的操作)而广受欢迎。它是仅头文件库(无需编译),支持 C++11 及更高版本,并提供高性能和类型安全。



安装该库很简单:只需下载一个头文件 json.hpp,或使用包管理器 vcpkg、Conan 或 CMake FetchContent。



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


C++ 中 JSON 解析基础



JSON 解析是将字符串转换为结构化数据的过程。nlohmann/json 库提供了多种解析方式。



从字符串解析



最常见的方法是使用静态方法 json::parse():



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

int main() { std::string json_string = R"({ "name": "伊万", "age": 30, "is_student": false, "skills": ["C++", "Python", "JavaScript"], "address": { "city": "莫斯科", "zip": "101000" } })";

try { json data = json::parse(json_string); // 访问数据 std::cout << "姓名: " << data["name"] << std::endl; std::cout << "年龄: " << data["age"] << std::endl; std::cout << "学生: " << (data["is_student"] ? "是" : "否") << std::endl; // 处理数组 for (auto& skill : data["skills"]) { std::cout << "技能: " << skill << std::endl; } // 处理嵌套对象 std::cout << "城市: " << data["address"]["city"] << std::endl; } catch (json::parse_error& e) { std::cerr << "解析错误: " << e.what() << std::endl; } return 0;}


从文件解析



要处理文件,请使用 C++ 的输入输出流:



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

int main() { std::ifstream file("data.json"); if (!file.is_open()) { std::cerr << "无法打开文件" << std::endl; return 1; } try { json data = json::parse(file); std::cout << "数据已加载: " << data.dump(2) << std::endl; } catch (json::parse_error& e) { std::cerr << "错误: " << e.what() << std::endl; } return 0;}


C++ 中的 JSON 序列化



序列化是反向过程:将 C++ 数据转换为 JSON 字符串。该库提供了 dump() 方法,并支持格式化。



创建 JSON 对象



您可以直接像创建普通关联数组一样创建 JSON 对象:



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

int main() { json person; person["name"] = "玛丽亚"; person["age"] = 25; person["is_employed"] = true; person["languages"] = {"俄语", "英语", "德语"};

博客

书籍推荐