当我们面对需要将C++类与结构体转换成json数据的需求时,最常见的方法是使用第三方库,例如jsoncpp、rapidjson等。在这里,我将为大家介绍一种简单易用的方法。它结合了C++11的特性和STL容器,使得代码简洁易读,同时具备高效性能。
步骤一:定义C++类结构体
首先,我们需要定义一个C++类或者结构体,来描述我们要转换为json数据的对象。例如,以下是一个简单的示例结构体:
struct Person {
std::string name;
int age;
std::vector<std::string> hobbies;
};
该结构体包含了三个成员变量:姓名name
、年龄age
和爱好hobbies
。其中,爱好是一个字符串类型的动态数组。
步骤二:实现转换函数
接下来,我们需要使用C++11的特性,定义一个转换函数,将我们的类或者结构体转换成json数据。例如,以下是一个实现该功能的函数:
#include <json.hpp>
using json = nlohmann::json;
json to_json(const Person& p) {
return {
{"name", p.name},
{"age", p.age},
{"hobbies", p.hobbies}
};
}
该函数中,我们使用了JSON for Modern C++库,将一个Person
类型的对象转换成了一个json数据,其中name
、age
和hobbies
分别对应了json数据中的键名。此外,由于hobbies
是一个字符串类型的动态数组,因此我们可以直接将它作为一个整体放到json数据中。
步骤三:实现反向转换函数
现在我们已经可以将一个Person
类型的对象转换成json数据了。我们同样需要一个反向转换函数,将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("hobbies").get_to(p.hobbies);
}
该函数中,我们首先使用j.at()
方法分别获取了json数据中name
、age
和hobbies
的值,并将它们分别赋值给了Person
对象的对应成员变量。
示例一:将C++类转换为json并输出
现在,我们已经实现了将一个Person
类型的对象转换成json数据,并将json数据还原成Person
类型的对象的功能。接下来,我们将利用这个功能,将一个Person
类型的对象转换成json数据,并输出到控制台中:
#include <iostream>
int main() {
Person p {
"张三",
25,
{"游泳", "旅游", "听音乐"}
};
json j = to_json(p);
std::cout << j.dump(4) << std::endl;
}
该示例中,我们首先创建了一个Person
类型的对象,并将它赋值给变量p。然后,我们调用to_json()
函数,将这个对象转换成了一个json数据。接着,我们使用dump(4)
方法,对json数据进行了格式化,并输出到控制台中。输出的结果如下:
{
"name": "张三",
"age": 25,
"hobbies": [
"游泳",
"旅游",
"听音乐"
]
}
示例二:从json数据中还原C++类
现在,我们已经可以将一个Person
类型的对象转换成json数据,并输出到控制台中了。我们同样可以使用反向函数,将json数据还原成Person
类型的对象。例如,以下是一个从json数据中还原Person
对象的示例代码:
#include <iostream>
int main() {
std::string json_str = R"({
"name": "李四",
"age": 32,
"hobbies": [
"看电影",
"打游戏",
"编程"
]
})";
json j = json::parse(json_str);
Person p;
from_json(j, p);
std::cout << "姓名:" << p.name << std::endl;
std::cout << "年龄:" << p.age << std::endl;
std::cout << "爱好:";
for (const auto& hobby : p.hobbies) {
std::cout << hobby << ", ";
}
std::cout << std::endl;
}
该示例中,我们首先定义了一段json字符串,描述了一个Person
类型的对象。然后,我们使用json::parse()
方法,将这个字符串解析成了json数据。接着,我们创建了一个空的Person
类型的对象,并调用from_json()
方法,将json数据中的值还原到这个对象上。最后,我们输出了这个对象的成员变量。输出的结果如下:
姓名:李四
年龄:32
爱好:看电影, 打游戏, 编程,
通过以上的示例,我们可以看出,通过使用jsoncpp、rapidjson等第三方库,我们可以轻松实现将C++类与结构体转换成json数据的功能。这些库提供了丰富的API,可以灵活地应对各种json数据场景。如果您的项目中需要处理复杂的json数据结构,则推荐您使用这些成熟的库。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++类结构体与json相互转换 - Python技术站