目录
JSON概述
nlohmann/json 库的使用
创建json数组/对象
字符串解析(parse反序列化)
数据访问
序列化
文件读写
JSON概述
JSON(JavaScrip Object Notation)是一种轻量级、跨语言的数据交换格式。它基于 ECMAScript 子集,以独立于编程语言的文本格式存储和表示数据,简洁清晰的结构使其成为理想的数据交换语言,易读、易写且便于机器解析生成,能提升网络传输效率 。
Json中主要有两种数据格式:Json数组和Json对象,并且这两种格式可以交叉嵌套使用。
Json数组使用 [] 表示,[]里边是元素,元素和元素之间使用逗号间隔。一个Json数组中支持同时存在多种不同类型的成员,包括:整形、 浮点、 字符串、 布尔类型、 json数组、 json对象、 空值-null。由此可见Json数组比起C/C++数组要灵活很多。
Json对象使用 {} 来描述,每个Json对象中可以存储若干个元素,每一个元素对应一个键值对(key:value 结构),元素和元素之间使用逗号间隔。键值必须是字符串,同一对象里,键不能重复,否则解析时会出现覆盖。
在一个Json文件中只能有一个Json数组或者Json对象的根节点,不允许同时存储多个并列的根节点。
数组为根:体现 有序集合关系 ,数据按位置(索引)排列,适合描述批量、同构 / 异构的列表数据。更关注数据的 “顺序” 和 “批量性”,而非单个数据的语义标签。比如(批量用户列表场景);
[{"name": "ZY", "age": 20},{"name": "LMM", "age": 20}
]
对象为根:体现键值映射关系 ,每个数据有明确的 “语义标签(键名)”,适合描述复杂实体(如用户信息、配置项),阅读和维护时能通过键名快速理解数据含义。比如(用户信息场景):
{"name": "ZY","age": 20,"is_student":true,"skills": ["C++", "Linux", "QT"]
}
nlohmann/json 库的使用
创建json数组/对象
创建数组:通过创建空数组逐步添加元素或直接初始化列表的形式创建。
json arr = { "ZY",20,true,{"C++","Linux","QT"} };json Arr = json::array();
Arr.push_back("ZY");
Arr.push_back(20);
Arr.push_back(true);
Arr.push_back({ "C++","Linux","QT" });
创建对象:通过创建空对象逐步添加键值对或直接初始化列表的形式创建。
json obj = { {"name","ZY"},{"age",20},{"is_student",true},{"skills",{"C++","Linux","QT"}} };json Obj;
Obj["name"] = "ZY";
Obj["age"] = 20;
Obj["is_student"] = true;
Obj["skills"] = { "C++","Linux","QT" };
字符串解析(parse反序列化)
std::string json_str = R"({"name": "ZY","age": 20,"is_student":true,"skills": ["C++", "Linux", "QT"]
})";
json json_obj = json::parse(json_str);
把符合 JSON 格式的字符串转换成 nlohmann::json
类型的对象,也就是 “反序列化” 操作,让程序能方便地访问 JSON 里的数据 。
数据访问
通过[]访问或者遍历,类似c++容器.demo:
std::cout << arr[3][0] << std::endl;
for (const auto& a : arr)
{std::cout << a << std::endl;
}
for (auto it = arr.begin(); it != arr.end(); ++it) {std::cout<< *it << std::endl;
}std::cout << obj["skills"][2] << std::endl;
for (auto it = obj.begin(); it != obj.end(); ++it) {std::string key = it.key(); json value = it.value(); std::cout << "Key: " << key << ", Value: " << value << std::endl;
}for (auto& element : obj.items()) {std::string key = element.key();json value = element.value();std::cout << "Key: " << key << ", Value: " << value << std::endl;
}std::string name = json_obj["name"];
int age = json_obj["age"];
bool is_student = json_obj["is_student"];
std::vector<std::string> skills = json_obj["skills"];
// 输出结果
std::cout << "Name: " << name << "\n";
std::cout << "Age: " << age << "\n";
std::cout << "Is student: " << (is_student ? "Yes" : "No") << "\n";
std::cout << "Skills: ";
for (const auto& skill : skills) {std::cout << skill << " ";
}
std::cout << std::endl;
序列化
json obj = { {"name","ZY"},{"age",20},{"is_student",true},{"skills",{"C++","Linux","QT"}} };
json Obj;
Obj["name"] = "ZY";
Obj["age"] = 20;
Obj["is_student"] = true;
Obj["skills"] = { "C++","Linux","QT" };std::string str = Obj.dump(2);
std::cout << str << std::endl;
把 nlohmann::json
类型的对象转换成 JSON 格式的字符串,方便输出、存储或者网络传输 。可以理解成 “序列化” 操作,将内存里的 JSON 对象变成能直接用文本形式处理的字符串。dump
可以带一个整数参数,用于指定缩进的空格数,让生成的 JSON 字符串更易读;不传参数时,生成紧凑的、没有额外空格的 JSON 字符串。
文件读写
// 写入 JSON 到文件
std::ofstream file("data.json");
file << j2.dump(2);
file.close();// 从文件读取 JSON
std::ifstream input("data.json");
json j_from_file;
input >> j_from_file;
json常用于c++开发中数据处理、通信、配置、调试等环节,nlohmann/json
等库让 C++ 处理 JSON 便捷高效,结合场景灵活运用,能提升程序的可维护性、扩展性与跨平台协作能力。
🌱🌱🌱.