现代化的 C++ JSON 库
nlohmann/json 是一个非常流行的 C++ JSON 库,以直观的语法和高性能著称。它是一个仅头文件的库,让在 C++ 中处理 JSON 数据变得极其简单。
vcpkg install nlohmann-json
conan install nlohmann_json/3.11.2@
// 下载 json.hpp 文件并直接包含
#include "json.hpp"
#include <iostream>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
int main() {
// 创建 JSON 对象
json j;
j["name"] = "John";
j["age"] = 25;
j["city"] = "Beijing";
std::cout << j.dump(4) << std::endl;
return 0;
}
// 从字符串解析
std::string json_str = R"({
"name": "John",
"age": 25,
"skills": ["C++", "Python", "JavaScript"]
})";
auto j = json::parse(json_str);
// 访问数据
std::string name = j["name"];
int age = j["age"];
std::vector<std::string> skills = j["skills"];
// 创建数组
json j_arr = json::array();
j_arr.push_back("item1");
j_arr.push_back("item2");
j_arr.push_back("item3");
// 或使用初始化列表
json j_arr2 = {"item1", "item2", "item3"};
// 遍历数组
for (const auto& item : j_arr) {
std::cout << item << std::endl;
}
// 访问元素
std::string first = j_arr[0];
size_t size = j_arr.size();
json person;
person["name"] = "John";
person["age"] = 25;
// 创建嵌套对象
person["address"] = {
{"street", "Main St"},
{"city", "Beijing"},
{"zip", "100000"}
};
// 创建嵌套数组
person["phones"] = {"123-456-7890", "987-654-3210"};
// 访问嵌套数据
std::string city = person["address"]["city"];
std::string phone = person["phones"][0];
// 输出格式化的 JSON
std::cout << person.dump(4) << std::endl;
json j;
// 自动类型推导
j["integer"] = 42;
j["floating"] = 3.14;
j["boolean"] = true;
j["string"] = "hello";
j["null"] = nullptr;
// 显式转换
int value = j["integer"].get<int>();
double pi = j["floating"].get<double>();
bool flag = j["boolean"].get<bool>();
std::string text = j["string"].get<std::string>();
// 检查类型
if (j["integer"].is_number_integer()) {
std::cout << "Is integer" << std::endl;
}
#include <fstream>
// 反序列化 - 从文件
json j;
std::ifstream("config.json") >> j;
// 序列化 - 保存到文件
std::ofstream("output.json") << std::setw(4) << j;
// 从字符串解析
std::string json_str = R"({"key": "value"})";
auto j = json::parse(json_str);
// 转换为字符串
std::string output = j.dump(); // 紧凑格式
std::string pretty = j.dump(4); // 缩进4个空格
#include <vector>
#include <map>
// std::vector 转 JSON
std::vector<int> vec = {1, 2, 3, 4, 5};
json j_vec = vec;
// JSON 转 std::vector
auto vec2 = j_vec.get<std::vector<int>>();
// std::map 转 JSON
std::map<std::string, int> m = {{"a", 1}, {"b", 2}};
json j_map = m;
// 自定义结构体
struct Person {
std::string name;
int age;
};
// 定义 to_json 和 from_json
void to_json(json& j, const Person& p) {
j = json{{"name", p.name}, {"age", p.age}};
}
void from_json(const json& j, Person& p) {
j.at("name").get_to(p.name);
j.at("age").get_to(p.age);
}
// 使用
Person p{"John", 25};
json j_person = p;
Person p2 = j_person.get<Person>();
json j = {
{"name", "John"},
{"age", 25},
{"skills", ["C++", "Python"]}
};
// 修改值
j["age"] = 26;
// 添加新字段
j["country"] = "China";
// 删除字段
j.erase("age");
// 检查键是否存在
if (j.contains("name")) {
std::cout << "Name: " << j["name"] << std::endl;
}
// 获取所有键
auto keys = j.items();
for (auto& [key, value] : keys) {
std::cout << key << ": " << value << std::endl;
}
| 操作 | 方法 | 说明 |
|---|---|---|
| 解析 | json::parse() |
从字符串解析 |
| 序列化 | dump() |
转换为字符串 |
| 类型检查 | is_string(), is_number() |
检查类型 |
| 获取值 | get<T>() |
获取指定类型 |
| 访问 | j["key"], j.at("key") |
访问字段 |