You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:21:03