C++中JSON处理:数据解析与序列化

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

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

开始课程

在 C++ 中使用 JSON 的入门介绍

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,广泛应用于 Web 开发、配置文件和 API 接口。尽管 C++ 没有内置的 JSON 支持,但有许多可靠的库可以简化数据的解析和序列化。在本文中,我们将介绍两个流行的库:nlohmann/json(推荐给初学者和现代项目使用)和 Boost.PropertyTree(适用于已经在使用 Boost 的用户)。您将学习如何在 C++ 中读取、创建、修改和输出 JSON 数据。



nlohmann/json 库:安装与基本概念

nlohmann/json 库(常被称为 "JSON for Modern C++")因其简单性和直观的 API 而成为最流行的库之一。它支持 C++11 及以上版本,无需外部依赖,并以单个头文件 json.hpp 的形式分发。



安装

从 GitHub 仓库 下载 json.hpp 文件,并将其放入您的项目文件夹中。然后在代码中包含它:

#include <iostream>#include <fstream>#include "json.hpp" // 包含库

using json = nlohmann::json;


从字符串和文件解析 JSON

该库允许从字符串、文件或输入流解析 JSON。让我们看一个从字符串解析的示例:

#include <iostream>#include "json.hpp"

using json = nlohmann::json;

int main() { // JSON 字符串 std::string jsonString = R"({ "name": "Alice", "age": 30, "isStudent": false, "hobbies": ["reading", "coding"] })"; // 解析 json data = json::parse(jsonString); // 访问数据 std::cout << "Name: " << data["name"] << std::endl; std::cout << "Age: " << data["age"] << std::endl; std::cout << "Is student: " << (data["isStudent"] ? "true" : "false") << std::endl; // 遍历数组 for (auto& hobby : data["hobbies"]) { std::cout << "Hobby: " << hobby << std::endl; } return 0;}

要从文件解析,请使用 json::parse(std::ifstream("data.json"));。



JSON 序列化

创建 JSON 对象并将其序列化为字符串的过程非常自然:

#include <iostream>#include "json.hpp"

using json = nlohmann::json;

int main() { json person; person["name"] = "Bob"; person["age"] = 25; person["isStudent"] = true; person["hobbies"] = {"gaming", "swimming"}; // 嵌套对象 json address; address["city"] = "Moscow"; address["street"] = "Tverskaya"; person["address"] = address; // 序列化为带缩进的字符串 std::string serialized = person.dump(4); // 4 个空格用于格式化 std::cout << serialized << std::endl; // 保存到文件 std::ofstream file("output.json"); file << person.dump(2); file.close(); return 0;}

dump() 方法将对象转换为字符串。参数指定缩进的空格数(0 表示紧凑输出)。



Boost.PropertyTree 库:另一种方法

如果您的项目中已经使用了 Boost,Boost.PropertyTree 库提供了一种处理 JSON 和其他格式(XML、INI)的便捷方式。它对于 JSON 的专门化程度较低,但与 Boost 生态系统集成良好。



使用 Boost.PropertyTree 解析 JSON

#include <iostream>#include <boost/property_tree/ptree.hpp>\                

博客

书籍推荐