1. JSON 创建
(1)创建 JSON 对象
cpp
json j;
j["name"] = "三三";
j["age"] = 20;
j["skills"] = { "C++", "Python", "Go" };
等效于:
json
{
"name": "三三",
"age": 20,
"skills": ["C++", "Python", "Go"]
}
(2)使用 initializer_list
直接构造
cpp
json j = {
{"name", "三三"},
{"age", 20},
{"skills", {"C++", "Python", "Go"}}
};
(3)创建 JSON 数组
cpp
json arr = json::array({1, 2, 3, 4, 5});
等效于:
json
[1, 2, 3, 4, 5]
2. 访问与修改 JSON
(1)访问 JSON 数据
cpp
std::string name = j["name"]; // "三三"
int age = j["age"]; // 20
std::string skill = j["skills"][0]; // "C++"
(2)检查键是否存在
cpp
if (j.contains("age")) {
std::cout << "Age: " << j["age"] << std::endl;
}
(3)修改 JSON
cpp
j["age"] = 21;
j["skills"].push_back("Rust"); // 添加新技能
j["city"] = "Shanghai"; // 新增字段
3. JSON 转字符串(序列化)
(1)紧凑格式
cpp
std::string compact = j.dump();
std::cout << compact << std::endl;
输出:
json
{"name":"三三","age":21,"skills":["C++","Python","Go","Rust"],"city":"Shanghai"}
(2)美化格式(带缩进)
cpp
std::string pretty = j.dump(4); // 4 代表缩进空格数
std::cout << pretty << std::endl;
输出:
json
{
"name": "三三",
"age": 21,
"skills": [
"C++",
"Python",
"Go",
"Rust"
],
"city": "Shanghai"
}
4. JSON 解析(反序列化)
(1)从字符串解析 JSON
cpp
std::string jsonStr = R"({"name":"三三","age":20,"skills":["C++","Python"]})";
json parsed = json::parse(jsonStr);
std::cout << parsed["name"] << std::endl; // "三三"
(2)从文件读取 JSON
cpp
std::ifstream file("data.json");
json j;
file >> j; // 直接流输入到 JSON 对象
file.close();
(3)写入 JSON 到文件
cpp
std::ofstream outFile("output.json");
outFile << j.dump(4); // 美化格式写入
outFile.close();
5. 遍历 JSON
(1)遍历对象
cpp
for (auto& [key, value] : j.items()) {
std::cout << key << " : " << value << std::endl;
}
输出:
text
name : "三三"
age : 21
skills : ["C++","Python","Go","Rust"]
city : "Shanghai"
(2)遍历数组
cpp
for (auto& skill : j["skills"]) {
std::cout << skill << std::endl;
}
输出:
text
C++
Python
Go
Rust
6. JSON 与 STL 容器互转
(1)STL 容器转 JSON
cpp
std::vector<int> nums = {1, 2, 3, 4, 5};
json j = nums; // 直接转换
std::cout << j.dump() << std::endl; // [1,2,3,4,5]
(2)JSON 转 STL 容器
cpp
std::vector<int> vec = j.get<std::vector<int>>();
(3)map 转 JSON
cpp
std::map<std::string, int> myMap = {{"A", 1}, {"B", 2}};
json j = myMap;
std::cout << j.dump() << std::endl; // {"A":1,"B":2}
(4)JSON 转 map
cpp
std::map<std::string, int> parsedMap = j.get<std::map<std::string, int>>();
7. JSON 其他常用方法
方法 | 说明 |
---|---|
j.empty() |
检查 JSON 是否为空 |
j.size() |
获取 JSON 元素数量 |
j.clear() |
清空 JSON |
j.erase("key") |
删除指定 key |
j.is_object() |
是否为对象 |
j.is_array() |
是否为数组 |
j.is_string() |
是否为字符串 |
j.is_number() |
是否为数值 |
示例:
cpp
if (j.is_object()) {
std::cout << "这是一个 JSON 对象" << std::endl;
}
总结
功能 | 方法 |
---|---|
创建 JSON | json j = {``{"key", "value"}}; |
访问/修改 JSON | j["key"] 、j["array"].push_back(value); |
序列化 JSON | j.dump() (紧凑格式)、j.dump(4) (美化格式) |
解析 JSON | json::parse(str) |
遍历 JSON | for(auto& [k, v] : j.items()) |
JSON 与 STL 互转 | json j = vec; 、std::map<std::string, int> m = j.get<std::map<std::string, int>>(); |
完整示例:C++ 使用 nlohmann/json
这个示例演示了 JSON 创建、访问、修改、序列化、反序列化、遍历、文件读写 等常见操作。
💻 示例代码
cpp
#include <iostream>
#include <fstream>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
int main() {
// 1. 创建 JSON 数据
json j;
j["name"] = "三三";
j["age"] = 20;
j["skills"] = {"C++", "Python", "Go"};
j["address"] = { {"city", "Shanghai"}, {"zip", "200000"} };
// 2. 访问 JSON 数据
std::cout << "Name: " << j["name"] << std::endl;
std::cout << "Age: " << j["age"] << std::endl;
std::cout << "First Skill: " << j["skills"][0] << std::endl;
std::cout << "City: " << j["address"]["city"] << std::endl;
// 3. 修改 JSON 数据
j["age"] = 21;
j["skills"].push_back("Rust"); // 添加新技能
j["address"]["district"] = "Pudong"; // 添加新字段
// 4. JSON 转字符串(序列化)
std::string jsonString = j.dump(4); // 美化格式
std::cout << "Serialized JSON:\n" << jsonString << std::endl;
// 5. 写入 JSON 到文件
std::ofstream outFile("output.json");
if (outFile.is_open()) {
outFile << jsonString;
outFile.close();
}
// 6. 从字符串解析 JSON(反序列化)
std::string jsonStr = R"({"status":"ok","message":"success","userId":123})";
json parsedJson = json::parse(jsonStr);
std::cout << "Parsed Message: " << parsedJson["message"] << std::endl;
// 7. 从文件读取 JSON
std::ifstream inFile("output.json");
if (inFile.is_open()) {
json readJson;
inFile >> readJson;
inFile.close();
std::cout << "Read JSON from file:\n" << readJson.dump(4) << std::endl;
}
// 8. 遍历 JSON 对象
std::cout << "Traversing JSON object:" << std::endl;
for (auto& [key, value] : j.items()) {
std::cout << key << " : " << value << std::endl;
}
return 0;
}
📌 代码解析
-
创建 JSON
j["name"] = "三三";
直接赋值创建 JSON 数据- 嵌套对象
j["address"] = { {"city", "Shanghai"}, {"zip", "200000"} };
- 数组
j["skills"] = {"C++", "Python", "Go"};
-
访问 & 修改 JSON
std::cout << j["name"];
访问 JSON 数据j["age"] = 21;
修改 JSONj["skills"].push_back("Rust");
动态添加数组元素
-
序列化 & 反序列化
std::string jsonString = j.dump(4);
转字符串(美化格式)json parsedJson = json::parse(jsonStr);
解析 JSON
-
文件读写
std::ofstream outFile("output.json");
写入文件std::ifstream inFile("output.json");
读取文件
-
遍历 JSON
for (auto& [key, value] : j.items())
遍历 JSON
📌 运行结果
text
Name: 三三
Age: 20
First Skill: C++
City: Shanghai
Serialized JSON:
{
"name": "三三",
"age": 21,
"skills": [
"C++",
"Python",
"Go",
"Rust"
],
"address": {
"city": "Shanghai",
"zip": "200000",
"district": "Pudong"
}
}
Parsed Message: success
Read JSON from file:
{
"name": "三三",
"age": 21,
"skills": [
"C++",
"Python",
"Go",
"Rust"
],
"address": {
"city": "Shanghai",
"zip": "200000",
"district": "Pudong"
}
}
Traversing JSON object:
name : "三三"
age : 21
skills : ["C++","Python","Go","Rust"]
address : {"city":"Shanghai","zip":"200000","district":"Pudong"}
✅ 你学到了什么?
json
创建、访问、修改dump()
序列化 &parse()
反序列化- JSON 读写文件
- 遍历 JSON 数据
你可以直接复制这段代码,运行看看!🚀