简述C++ nlohmann/json 库

目录

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 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;

简述C++ nlohmann/json 库_第1张图片

序列化

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 字符串。 

 简述C++ nlohmann/json 库_第2张图片

文件读写

// 写入 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 便捷高效,结合场景灵活运用,能提升程序的可维护性、扩展性与跨平台协作能力。

.

你可能感兴趣的:(json,c++,nlohmann)