如何使用C++ Boost JSON库从已有数据生成指定结构的JSON文件?
用 Boost.PropertyTree 生成指定结构的 JSON 文件
核心注意点
Boost.PropertyTree 没有原生数组类型,要生成 JSON 数组,必须对同一个键重复插入子节点——比如要得到"Wheel": [...]的数组结构,就需要多次向Wheels节点插入键为"Wheel"的子树。
补全后的完整代码
#include "boost/property_tree/ptree.hpp" #include "boost/property_tree/json_parser.hpp" #include <string> #include <iostream> using namespace std; using boost::property_tree::ptree; struct wheel { string start_pos; string end_pos; }; struct brake { string start_pos; string midl_pos; }; // 辅助函数:将wheel结构体转为ptree节点 ptree wheel_to_ptree(const wheel& w) { ptree pt; pt.put("start_pos", w.start_pos); pt.put("end_pos", w.end_pos); return pt; } // 辅助函数:将brake结构体转为ptree节点 ptree brake_to_ptree(const brake& b) { ptree pt; pt.put("start_pos", b.start_pos); pt.put("midl_pos", b.midl_pos); return pt; } int main() { // 初始化业务数据 wheel w1{"10", "25"}; wheel w2{"22", "78"}; brake b1{"10", "25"}; // 构建根节点与track层级节点 ptree root; ptree track_node; // 构建Wheels节点及下属Wheel数组 ptree wheels_node; wheels_node.push_back(make_pair("Wheel", wheel_to_ptree(w1))); wheels_node.push_back(make_pair("Wheel", wheel_to_ptree(w2))); track_node.put_child("Wheels", wheels_node); // 构建Brakes节点及下属Brake数组 ptree brakes_node; brakes_node.push_back(make_pair("Brake", brake_to_ptree(b1))); track_node.put_child("Brakes", brakes_node); // 将track节点挂载到根节点 root.put_child("track", track_node); // 输出JSON到文件(第三个参数为true时开启格式化输出) write_json("output.json", root, true); // 也可直接输出到控制台 // write_json(cout, root, true); return 0; }
关键步骤说明
- 结构体转ptree:通过辅助函数将自定义结构体封装为ptree节点,避免重复代码,提升可读性。
- 生成数组逻辑:调用
push_back(make_pair("键名", 子ptree))重复插入同名键,Boost会自动将其解析为JSON数组。 - 层级构建:从最内层的Wheel/Brake节点开始,逐层向上构建到track节点,最终挂载到根节点。
- JSON输出:
write_json支持输出到文件或标准输出,第三个参数控制是否开启格式化排版。
最终生成的JSON结构
运行代码后会生成完全符合需求的JSON文件:
{ "track": { "Wheels": { "Wheel": [ { "start_pos": "10", "end_pos": "25" }, { "start_pos": "22", "end_pos": "78" } ] }, "Brakes": { "Brake": [ { "start_pos": "10", "midl_pos": "25" } ] } } }
内容的提问来源于stack exchange,提问作者Nindzzya
相关产品推荐
相关产品推荐

