JSON简介及C++中的JSON使用指南
1. 什么是JSON?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用文本格式存储和传输数据。它易于人阅读和编写,同时也易于机器解析和生成。JSON广泛应用于Web API、配置文件、数据存储等领域。
JSON的特点
- 轻量级:相比XML,JSON更加简洁,占用更少的带宽。
- 易读性:采用键值对(
key: value
)结构,类似字典或哈希表。 - 跨语言支持:几乎所有编程语言都支持JSON解析和生成。
- 结构化数据:支持嵌套对象和数组,适合复杂数据表示。
JSON基本语法
JSON数据由以下几种结构组成:
- 对象(Object):用
{ }
包裹,键值对用:
分隔,多个键值对用,
分隔。{ "name": "Alice", "age": 25, "isStudent": true }
- 数组(Array):用
[ ]
包裹,元素之间用,
分隔。["apple", "banana", "orange"]
- 值(Value):可以是字符串、数字、布尔值、
null
、对象或数组。
2. C++ 如何使用JSON?
C++标准库没有内置JSON支持,但可以使用第三方库来解析和生成JSON。常用的库有:
- nlohmann/json(推荐,简单易用)
- RapidJSON(高性能,适合嵌入式)
- JsonCpp(较老但仍广泛使用)
2.1 使用 nlohmann/json(推荐)
安装
- 方法1:通过包管理器(如vcpkg、conan)安装:
vcpkg install nlohmann-json
- 方法2:直接包含头文件(单文件库):
#include <nlohmann/json.hpp> using json = nlohmann::json; // 别名简化
基本用法
(1)解析JSON字符串
#include <iostream>
#include <nlohmann/json.hpp>
int main() {
std::string jsonStr = R"(
{
"name": "Bob",
"age": 30,
"hobbies": ["reading", "gaming"]
}
)";
// 解析JSON
auto data = json::parse(jsonStr);
// 访问数据
std::cout << "Name: " << data["name"] << std::endl; // "Bob"
std::cout << "Age: " << data["age"] << std::endl; // 30
std::cout << "Hobby 1: " << data["hobbies"][0] << std::endl; // "reading"
return 0;
}
(2)生成JSON
#include <iostream>
#include <nlohmann/json.hpp>
int main() {
json data;
data["name"] = "Alice";
data["age"] = 25;
data["isStudent"] = true;
data["courses"] = {"Math", "Physics"};
// 转换为字符串
std::string jsonStr = data.dump(4); // 4表示缩进(美化输出)
std::cout << jsonStr << std::endl;
return 0;
}
输出:
{
"name": "Alice",
"age": 25,
"isStudent": true,
"courses": ["Math", "Physics"]
}
(3)处理文件
#include <fstream>
#include <nlohmann/json.hpp>
int main() {
// 从文件读取JSON
std::ifstream input("data.json");
json data;
input >> data;
// 修改数据
data["age"] = 26;
// 写回文件
std::ofstream output("data_updated.json");
output << std::setw(4) << data << std::endl;
return 0;
}
2.2 使用 RapidJSON(高性能解析)
RapidJSON 是一个高效的C++ JSON解析库,适用于对性能要求较高的场景。
安装
- 从 GitHub 下载:RapidJSON
- 直接包含头文件:
#include "rapidjson/document.h" #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h"
基本用法
#include <iostream>
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
int main() {
const char* jsonStr = R"({"name":"Tom","age":20})";
// 解析JSON
rapidjson::Document doc;
doc.Parse(jsonStr);
// 访问数据
std::cout << "Name: " << doc["name"].GetString() << std::endl;
std::cout << "Age: " << doc["age"].GetInt() << std::endl;
// 生成JSON
rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
writer.StartObject();
writer.Key("name");
writer.String("Jerry");
writer.Key("age");
writer.Int(22);
writer.EndObject();
std::cout << buffer.GetString() << std::endl;
return 0;
}
3. 总结
对比项 | nlohmann/json | RapidJSON | JsonCpp |
---|---|---|---|
易用性 | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ |
性能 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ |
适用场景 | 通用开发 | 高性能解析 | 旧项目兼容 |
- 推荐使用
nlohmann/json
:API友好,适合大多数C++项目。 - 需要极致性能时用
RapidJSON
:如高频JSON解析(游戏、嵌入式)。 - 旧项目维护可用
JsonCpp
:兼容性好,但性能较低。