使用nlohmann/json从std::vector生成指定结构JSON文件的问题
解决方案与代码修正
核心思路
完全可以通过单个nlohmann::json对象生成目标结构——只需先创建根JSON对象,再将std::vector<Car>序列化为JSON数组,最后将该数组绑定到myCars层级即可。关键是要确保自定义Car类型能被nlohmann/json库正确序列化。
完整代码示例
1. 定义自定义类型与序列化逻辑
#include <nlohmann/json.hpp> #include <vector> #include <fstream> #include <string> using json = nlohmann::json; // 自定义Car类 struct Car { std::string brand; std::string model; int production_year; }; // 重载to_json函数,让库能识别并序列化Car对象 void to_json(json& j, const Car& car) { j = json{ {"brand", car.brand}, {"model", car.model}, {"productionYear", car.production_year} }; }
2. 生成目标结构JSON
int main() { // 构造测试用的车辆列表 std::vector<Car> car_list = { {"Tesla", "Model 3", 2024}, {"BMW", "X5", 2023}, {"Audi", "A4", 2022} }; // 构建包含myCars层级的根JSON对象 json root_json; root_json["myCars"] = car_list; // 库自动将vector<Car>转为JSON数组 // 输出到文件(带4空格缩进,提升可读性) std::ofstream out_file("my_cars.json"); out_file << root_json.dump(4); return 0; }
关键细节说明
- 自定义类型序列化:必须实现
to_json重载函数,这是nlohmann/json处理自定义对象的标准约定,库会自动递归处理std::vector这类容器的序列化。 - 层级构建:直接给根JSON对象的
myCars键赋值std::vector<Car>即可,无需手动遍历数组元素添加,库会自动完成转换。 - 常见问题排查:如果之前代码无法生成目标结构,大概率是遗漏了
to_json重载,或者错误地直接序列化vector而没有将其放入myCars键下。
内容的提问来源于stack exchange,提问作者ThomasAlvaEdison
相关产品推荐
相关产品推荐

