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

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

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

开始课程

C++中的JSON处理:库概述与实践示例



JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于Web应用程序、API和配置文件中。在C++中,标准库并未内置JSON处理功能,因此开发者需要使用第三方库。本文将介绍三种最流行的工具:nlohmann/json、RapidJSON和Boost.JSON。您将学习如何安装它们、解析JSON、创建自定义结构以及序列化数据。所有示例均附有C++代码。



1. nlohmann/json库



nlohmann/json是C++中最流行的JSON处理库。它以其简单直观的语法而闻名,类似于Python或JavaScript。该库是header-only(仅头文件)的,因此集成非常简单:只需将json.hpp文件复制到项目中即可。



安装

从GitHub下载json.hpp并包含它:

#include "json.hpp"using json = nlohmann::json;


解析JSON字符串

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

int main() { std::string json_str = R"({ "name": "Alice", "age": 30, "is_student": false, "skills": ["C++", "Python", "JSON"] })";

json data = json::parse(json_str);

std::cout << "Name: " << data["name"] << std::endl; std::cout << "Age: " << data["age"] << std::endl; std::cout << "First skill: " << data["skills"][0] << std::endl;

return 0;}


创建与序列化JSON

json person;person["name"] = "Bob";person["age"] = 25;person["is_student"] = true;person["languages"].push_back("C");person["languages"].push_back("Java");

std::string serialized = person.dump(4); // 4 — 缩进,用于美化输出std::cout << serialized << std::endl;


2. RapidJSON库



RapidJSON是一个高性能库,专注于速度和最小内存使用。它也是header-only的,并支持SAX风格解析(流式)和DOM风格解析(构建树)。适用于对性能要求较高的项目,例如游戏引擎或高负载服务器。



安装

从RapidJSON仓库下载文件并包含:

#include "rapidjson/document.h"#include "rapidjson/writer.h"#include "rapidjson/stringbuffer.h"


解析JSON

#include <iostream>#include "rapidjson/document.h"

int main() { const char* json = "{\\"name\\":\\"Charlie\\",\\"age\\":28,\\"active\\":true}"; rapidjson::Document doc; doc.Parse(json);

if (doc.HasParseError()) { std::cerr << "Parse error!" << std::endl; return 1; }

std::cout << "Name: " << doc["name"].GetString() << std::endl; std::cout << "Age: " << doc["age"].GetInt() << std::endl;

return 0;}


创建JSON与序列化

rapidjson::Document doc;doc.SetObject();rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();

doc.AddMember("name", "Diana", allocator);doc.AddMember("score", 95.5, allocator);

rapidjson::StringBuffer buffer;rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);doc.Accept(writer);

std::cout << buffer.GetString() << std::endl;


3. Boost.JSON库



Boost.JSON是Boost库的一部分,已被正式纳入C++ Boost

推荐