快速掌握 JSON!文章 + 视频双管齐下
如果你觉得阅读文章太慢,或者更喜欢 边看边学 的方式,不妨直接观看我录制的 JSON for Modern C++ 课程视频! 视频里会用更直观的方式讲解 JSON for Modern C++ 的核心概念、实战技巧,并配有动手演示,让你更高效地掌握 JSON for Modern C++ 的处理方法!
当然,如果你喜欢深度阅读,这篇文章会帮助你系统地理解 JSON for Modern C++,从基础到进阶!无论你选择哪种方式,最终目标都是让你成为 JSON for Modern C++ 处理的高手!
点击这里观看视频 视频链接
在现代 C++ 开发中,nlohmann/json
(JSON for Modern C++)是一个轻量级、STL 友好、使用直观的 JSON 库。本部分将详细讲解其用法,并通过实战案例演示如何高效处理 JSON 数据。
JSON for Modern C++
(简称 nlohmann/json)是一个以现代 C++ 风格编写的 JSON 库,旨在提供简单、易用、且符合现代 C++ 编程习惯的 API。其设计理念围绕 类型安全 和 零依赖性,并且支持 C++11 及以上版本。该库采用了一些 C++11 引入的功能,如智能指针、范围for循环、auto
关键字、lambda 表达式等,使得代码更加简洁、可读且类型安全。
JSON for Modern C++
适用于大部分 C++ 项目,尤其是那些需要快速集成 JSON 处理的场景。std::vector
、std::map
等)集成,允许开发者直接将 JSON 对象与这些容器转换。nlohmann/json
是一个头文件-only 库,意味着它不依赖于外部库或特定平台,因此在任何支持 C++11 或更高版本的编译器上都可以使用,适合用于跨平台开发。在选择 JSON 库时,JSON for Modern C++
与其他流行的库(如 RapidJSON
、JsonCpp
、cJSON
)相比,具有一些独特的优势和特点:
特性/库 | JSON for Modern C++ | RapidJSON | JsonCpp | cJSON |
---|---|---|---|---|
API 风格 | 现代 C++ 风格,类型安全,简洁 | 函数式风格,性能优先 | C 风格,接口不够简洁 | C 风格,简单,功能少 |
性能 | 中等,适合大部分应用 | 高性能,适合需要高吞吐量的应用 | 中等性能,适合普通场景 | 高性能,尤其在嵌入式应用中 |
依赖性 | 零依赖,头文件-only 库 | 依赖 C++ 标准库 | 依赖 C++ 标准库及一些外部库 | 零依赖,单个文件 |
易用性 | 高,简洁的语法和 API | 稍复杂,但高性能优化 | API 相对繁琐,不太现代化 | 简单,但缺少很多现代 C++ 特性 |
JSON 类型支持 | 支持标准容器和自定义类型 | 支持标准容器和自定义类型 | 支持标准容器和自定义类型 | 只支持基本数据类型 |
流式解析支持 | 不直接支持,需手动实现 | 支持流式解析(SAX) | 支持流式解析(SAX) | 不支持流式解析 |
社区和文档支持 | 活跃,良好的文档和社区支持 | 活跃,文档稍有难度 | 社区不如前两者活跃 | 简单,社区较小 |
nlohmann/json
使用现代 C++ 编程语言特性(如类型推导、范围 for
循环、智能指针、auto
、lambda 表达式等),让 JSON 操作变得更加简单和清晰。std::vector
, std::map
等)兼容,直接将 JSON 对象和容器类进行转换,使得开发者无需手动序列化或反序列化容器对象。JSON for Modern C++
确保每个操作都具有类型安全,避免了类型不匹配的问题。这种类型安全的优势特别适合大型项目中,减少了出错的可能性。nlohmann/json
完全是一个头文件-only 库,不需要链接其他的动态/静态库,使用非常方便。std::map
, std::vector
, std::string
等)转换为 JSON 对象,或者将 JSON 数据映射到 C++ 类型。适用于所有需要解析和生成 JSON 的项目:包括 Web 应用程序、配置文件解析、日志系统、网络协议处理等。
快速开发和原型设计:由于它的简洁性和与 STL 容器的良好兼容性,非常适合用于快速开发。
跨平台开发:作为一个头文件-only 库,可以在多平台上轻松集成,不依赖于外部库。
JSON for Modern C++
(nlohmann/json)是一个头文件-only 的库,因此无需安装复杂的依赖项或编译过程。只需将源代码文件添加到项目中即可使用。
✅ 方式 1:使用 vcpkg,如果你使用 vcpkg
作为 C++ 包管理工具。
vcpkg install nlohmann-json
✅ 方式 2:使用 CMake
find_package(nlohmann_json REQUIRED) # 查找并引入 nlohmann_json 这个 JSON 库,以便在 C++ 项目中使用它
target_link_libraries(my_project PRIVATE nlohmann_json::nlohmann_json)
✅ 方式 3: 手动下载
访问 GitHub 仓库:https://github.com/nlohmann/json。
下载最新的 .zip 文件,或者使用 Git 克隆仓库:
git clone https://github.com/nlohmann/json.git
将 json.hpp
文件复制到项目的包含目录。
single_include/nlohmann/json.hpp
文件。json.hpp
文件复制到你的项目目录中,通常可以放在 include
文件夹下,保持项目结构清晰。假设你的项目目录结构如下:
MyProject/
├── src/
│ └── main.cpp
└── include/
└── json.hpp
#include "json.hpp"
using json = nlohmann::json; // 编译要 g++ -std=c++11
示例:解析 JSON
#include
#include "json.hpp" // 引入 JSON 库头文件
using json = nlohmann::json;
int main() {
// 创建 JSON 对象
json j = {
{
"name", "Alice"},
{
"age", 25},
{
"city", "New York"}
};
// 打印 JSON 对象
std::cout << j.dump(4) << std::endl; // 使用 4 个空格进行缩进
return 0;
}
解析 JSON 字符串非常简单,只需要使用 nlohmann::json::parse
函数。
#include
#include "json.hpp"
using json = nlohmann::json;
int main() {
// 1. 解析 JSON 字符串
std::string json_str = R"({"name": "Alice", "age": 25, "city": "New York"})";
// 解析 JSON 字符串为 JSON 对象
json j = json::parse(json_str);
// 格式化输出 JSON 对象
std::cout << "Parsed JSON:" << std::endl;
std::cout << j.dump(4) << std::endl; // 格式化输出,4 表示缩进的空格数
return 0;
}
输出:
Parsed JSON:
{
"age": 25,
"city": "New York",
"name": "Alice"
}
JSON 数组解析与对象解析类似。下面是解析一个包含多个元素的数组的例子。
#include
#include "json.hpp"
using json = nlohmann::json;
int main() {
// 2. 解析 JSON 数组
std::string json_str = R"([{"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}])";
// 解析 JSON 数组
json j = json::parse(json_str);
// 格式化输出 JSON 数组
std::cout << "Parsed JSON Array:" << std::endl;
std::cout << j.dump(4) << std::endl; // 格式化输出
return 0;
}
输出:
Parsed JSON Array:
[
{
"age": 25,
"name": "Alice"
},
{
"age": 30,
"name": "Bob"
}
]
与解析 JSON 字符串类似,直接将 JSON 对象作为字符串进行解析。你可以访问 JSON 对象的键值。
#include
#include "json.hpp"
using json = nlohmann::json;
int main() {
// 3. 解析 JSON 对象
std::string json_str = R"({"name": "Alice", "age": 25, "city": "New York"})";
// 解析为 JSON 对象
json j = json::parse(json_str);
// 访问 JSON 对象的值
std::cout << "Name: " << j["name"] << std::endl;
std::cout << "Age: " << j["age"] << std::endl;
std::cout << "City: " << j["city"] << std::endl;
return 0;
}
输出:
Name: "Alice"
Age: 25
City: "New York"
你可以使用 dump()
方法来格式化输出 JSON 对象。
#include
#include "json.hpp"
using json = nlohmann::json;
int main() {
// 4. 创建一个 JSON 对象
json j = {
{
"name", "Alice"},
{
"age", 25},
{
"city", "New York"}
};
// 格式化输出 JSON 对象
std::cout << "Formatted JSON:" << std::endl;
std::cout << j.dump(4) << std::endl; // 4 表示缩进