【问题标题】:How to add a key with a dot in the name to a json file [duplicate]如何将名称中带有点的键添加到json文件中[重复]
【发布时间】:2021-09-08 20:45:49
【问题描述】:

我正在阅读一些信息,我想将其写成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);

【问题讨论】:

  • 您的键通常应该是带引号的字符串。 { "programs" : { "temp.exe" : "d:\\Directory\\directory", "foo.exe" : "c:\\Directory" } }。如果这不是你得到的,你可能只是想切换到更好的 JSON 库。
  • Boost 属性树不是最好的 JSON 库,它有很多限制,最好使用专门的 JSON 库
  • 从一些有效 JSON开始。您可以使用jsonlint.com 之类的在线网站进行检查。提示:您的 JSON 并不接近有效。
  • 为了清楚起见,这只是一个示例。主要问题是我需要在名称中设置一个带点的键。我不能在这个项目中使用除了 boost 之外的库
  • FWIW:我在 boost-propertytree 标签中搜索了“点”(即我在本网站的搜索字段中输入了 [boost-propertytree] dot)。热门歌曲是我为此提出的副本的副本。

标签: c++ json boost boost-propertytree


【解决方案1】:

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

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

例子:

#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"
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 2015-10-24
    • 2018-08-30
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多