Loading... **C++结构体与JSON的相互转换** 在现代软件开发中,数据的序列化和反序列化是一个常见的需求。尤其在客户端和服务器之间的数据交换中,JSON因其简单、易读和良好的兼容性而被广泛使用。本文将介绍如何在C++中实现结构体和JSON之间的相互转换,重点介绍使用 `nlohmann/json`库。 ### nlohmann/json库简介 `nlohmann/json`是一个流行的开源JSON库,支持C++11及以上版本。它提供了直观和简洁的接口,能够轻松地将C++对象与JSON数据相互转换。 ![](https://www.8kiz.cn/usr/uploads/2024/07/1366915187.png) ### 安装nlohmann/json库 可以通过以下几种方式安装 `nlohmann/json`库: 1. **使用包管理器**(如vcpkg或Conan): ```bash vcpkg install nlohmann-json ``` 2. **手动下载**库文件,并将 `json.hpp`包含到你的项目中: ```cpp #include "json.hpp" ``` ### C++结构体与JSON的相互转换 #### 定义结构体 首先,定义一个C++结构体,例如: ```cpp struct Person { std::string name; int age; std::string address; }; ``` #### 转换函数 为了实现结构体与JSON的相互转换,需要定义两个函数:一个用于序列化(结构体转JSON),另一个用于反序列化(JSON转结构体)。 ```cpp #include <iostream> #include <string> #include "json.hpp" using json = nlohmann::json; struct Person { std::string name; int age; std::string address; }; // 序列化:结构体 -> JSON void to_json(json& j, const Person& p) { j = json{{"name", p.name}, {"age", p.age}, {"address", p.address}}; } // 反序列化:JSON -> 结构体 void from_json(const json& j, Person& p) { j.at("name").get_to(p.name); j.at("age").get_to(p.age); j.at("address").get_to(p.address); } ``` #### 使用示例 ```cpp int main() { // 创建一个Person对象 Person person = {"John Doe", 30, "123 Main St"}; // 将Person对象序列化为JSON json j = person; std::cout << "Serialized JSON: " << j << std::endl; // 将JSON反序列化为Person对象 Person new_person = j.get<Person>(); std::cout << "Deserialized Person: " << new_person.name << ", " << new_person.age << ", " << new_person.address << std::endl; return 0; } ``` ### 处理复杂结构体 如果结构体包含复杂数据类型或嵌套结构体,可以使用相同的方法进行处理。以下是一个示例: ```cpp struct Address { std::string city; std::string street; }; struct Employee { std::string name; int age; Address address; }; // 序列化:结构体 -> JSON void to_json(json& j, const Address& a) { j = json{{"city", a.city}, {"street", a.street}}; } void to_json(json& j, const Employee& e) { j = json{{"name", e.name}, {"age", e.age}, {"address", e.address}}; } // 反序列化:JSON -> 结构体 void from_json(const json& j, Address& a) { j.at("city").get_to(a.city); j.at("street").get_to(a.street); } void from_json(const json& j, Employee& e) { j.at("name").get_to(e.name); j.at("age").get_to(e.age); j.at("address").get_to(e.address); } int main() { // 创建一个Employee对象 Address address = {"New York", "5th Avenue"}; Employee employee = {"Alice", 28, address}; // 将Employee对象序列化为JSON json j = employee; std::cout << "Serialized JSON: " << j << std::endl; // 将JSON反序列化为Employee对象 Employee new_employee = j.get<Employee>(); std::cout << "Deserialized Employee: " << new_employee.name << ", " << new_employee.age << ", " << new_employee.address.city << ", " << new_employee.address.street << std::endl; return 0; } ``` ### 结论 使用 `nlohmann/json`库,可以简便地在C++中实现结构体与JSON之间的相互转换。通过定义序列化和反序列化函数,可以处理简单和复杂的结构体类型。这种方法不仅提高了代码的可读性和维护性,还增强了数据交换的灵活性。 最后修改:2024 年 07 月 10 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏