如何使用ptree向JSON文件中添加名称包含点的键
问题原因
Boost.PropertyTree的put方法默认会把键名字符串中的.识别为层级路径分隔符,因此会自动把带点的键名拆分为嵌套的子节点结构,和你预期的平级键值对不符。
解决方法
有两种常用的实现方案可以避开路径解析逻辑:
方案1:使用push_back直接插入节点(最稳妥)
直接调用ptree的push_back方法插入键值对,完全不触发路径解析逻辑,天然支持带点的键名:
#include <boost/property_tree/ptree.hpp> #include <boost/property_tree/json_parser.hpp> using namespace boost::property_tree; int main() { ptree pt; ptree programs_node; std::string string_name = "tmp.exe"; std::string string_directory = "D:\\Directory\\Directory"; std::string string_name2 = "foo.exe"; std::string string_directory2 = "C:\\Directory"; // 直接插入键值对,不会解析点为路径分隔符 programs_node.push_back(ptree::value_type(string_name, ptree(string_directory))); programs_node.push_back(ptree::value_type(string_name2, ptree(string_directory2))); pt.add_child("programs", programs_node); write_json("output.json", pt); return 0; }
方案2:自定义路径分隔符
如果需要沿用put的写法,可以用ptree::path_type自定义路径分隔符,选择一个键名中绝对不会出现的字符(比如\0)作为分隔符,就不会拆分带点的键名:
// 第二个参数指定路径分隔符为\0,不会触发点的拆分逻辑 programs_node.put(ptree::path_type(string_name, '\0'), string_directory); programs_node.put(ptree::path_type(string_name2, '\0'), string_directory2);
错误代码说明
你之前尝试的写法逻辑存在问题:name.put("",string_name);是给空路径的根节点赋值为键名,后续find也无法定位到对应节点,不建议使用。
内容的提问来源于stack exchange,提问作者AlexChek
相关产品推荐
相关产品推荐

