目錄
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 便捷高效,結合場景靈活運用,能提升程序的可維護性、擴展性與跨平臺協作能力。
🌱🌱🌱.