如何使用Boost正确修改JSON文件中的指定字段值?
修正Boost Property Tree修改JSON字段的问题
原问题场景
现有JSON文件:
{ .... .... "frequency_ask": 900 }
需要将frequency_ask字段值修改为1200,但编写的函数无法正常工作,原代码如下:
原函数代码:
void setFieldToJson(std::string json, std::string field, int value) { boost::property_tree::ptree pt; pt.put(field, value); std::ostringstream json; boost::property_tree::write_json(json, pt); }
调用语句:
setFieldToJson("../config_files/device.json", "frequency_ask", 1200);
原代码的问题
- 未读取原JSON文件:直接创建空的
ptree并添加字段,相当于生成全新的仅含目标字段的JSON,完全忽略了原文件的其他内容 - 变量名冲突:函数内部定义的
std::ostringstream json和参数std::string json重名,会导致编译错误 - 未写回原文件:仅将数据写入内存流,没有把修改后的内容保存到原JSON文件中
修正后的代码
#include <boost/property_tree/ptree.hpp> #include <boost/property_tree/json_parser.hpp> #include <sstream> #include <string> void setFieldToJson(const std::string& file_path, const std::string& field, int value) { // 1. 读取原JSON文件到property tree boost::property_tree::ptree pt; try { boost::property_tree::read_json(file_path, pt); } catch (const boost::property_tree::json_parser_error& e) { // 处理文件读取错误,比如打印日志或抛出异常 return; } // 2. 修改指定字段的值 pt.put(field, value); // 3. 将修改后的内容写回原文件 try { boost::property_tree::write_json(file_path, pt); } catch (const boost::property_tree::json_parser_error& e) { // 处理文件写入错误 return; } }
调用方式保持不变:
setFieldToJson("../config_files/device.json", "frequency_ask", 1200);
说明
- 增加了异常捕获,处理文件读写可能出现的错误(比如文件不存在、权限不足等)
- 将参数名改为
file_path避免和内部变量冲突 - 完整实现了"读原文件→修改字段→写回文件"的流程,确保原JSON的其他字段不会丢失
内容的提问来源于stack exchange,提问作者metcenger
相关产品推荐
相关产品推荐

