如何将名称中带点的密钥添加到 json 文件

How to add a key with a dot in the name to a json file

我正在看一些资料,我想写在json,但是有些键的名称中包含点号。我想得到这样的东西:

{
  "programs":
   {
      "tmp.exe" : "D:\Directory\Directory",
      "foo.exe" : "C:\Directory"
   }
}

这是我的代码:

ptree pt;
ptree name;

name.put(string_name,string_directory);
pt.add_child("programs",name);

但结果如下:

    {
      "programs":
       {
          "tmp":
              {
                "exe" : "D:\Directory\Directory"
              },
          "foo": 
              {
                "exe" : "C:\Directory"
              }
       }
    }

小时候我想把它加进去。但是这段代码根本不起作用

ptree pt;
ptree name;

name.put("",string_name);
pt.add_child("programs",name);
pt.find(string_name).put_value(string_directory);

虽然我测试过的所有 JSON linters 都接受你的目标 JSON 是有效的并且 boost::property_tree::read_json 解析它,但实际上创建它有点麻烦。这是因为 boost::property_tree 默认使用 . 作为路径分隔符。

为了克服这个问题,您可以指定 Key 与指定另一个字符的默认值 ptree::path_type 不同。我在这里使用 \ 作为路径分隔符,因为它不太可能成为文件基本名称的一部分。

示例:

#include <boost/property_tree/json_parser.hpp>
#include <boost/property_tree/ptree.hpp>

#include <iostream>

int main() {
    using namespace boost::property_tree;

    try {
        ptree pt;
        ptree name;

        name.put(ptree::path_type{"tmp.exe", '\'}, "D:\Directory\Directory");
        name.put(ptree::path_type{"foo.exe", '\'}, "C:\Directory");

        pt.add_child("programs", name);
        write_json(std::cout, pt);

    } catch(const std::exception& ex) {
        std::cout << "exception: " << ex.what() << '\n';
    }
}

输出:

{
    "programs": {
        "tmp.exe": "D:\Directory\Directory",
        "foo.exe": "C:\Directory"
    }
}