json 文件的 C++ Boost 程序选项
C++ Boost program options with json file
可以使用 boost 程序选项库:http://www.boost.org/doc/libs/1_64_0/doc/html/program_options.html
要在此处读取 json 格式的文件作为输入文件?
或者如果我在 json 中有一些配置,比如文件,我需要自己解析它,例如:http://www.boost.org/doc/libs/1_64_0/doc/html/property_tree.html
It is possible with boost program options library:
http://www.boost.org/doc/libs/1_64_0/doc/html/program_options.html
to read json formatted file as an input file here?
不,但是如果你为它写一个Parser Component就可以了
Or if I have some config in json like file, I need to parse it myself,
with for example:
http://www.boost.org/doc/libs/1_64_0/doc/html/property_tree.html
可以。请务必检查 。另外,请注意 "json like" 之类的东西。有可能任何非标准的东西 JSON 都会破坏解析器,所以如果它不是标准的,你可能想要手动处理它。
我遇到了同样的问题。这是我为 program_options 库实现的 JSON 解析器,基于 property_tree:
template <class charT> void parseChildren(std::string prefix, boost::property_tree::ptree& tree, boost::program_options::parsed_options& options)
{
if (tree.size() == 0)
{
//cut first dot
std::basic_string<charT> name = prefix.substr(1);
std::basic_string<charT> value = tree.data();
boost::program_options::basic_option<charT> opt;
opt.string_key = name;
opt.value.push_back(value);
opt.unregistered = (options.description->find_nothrow(name, false) == nullptr);
opt.position_key = -1;
options.options.push_back(opt);
}
else
{
for (auto it = tree.begin(); it != tree.end(); ++it)
{
parseChildren<charT>(prefix + "." + it->first, it->second, options);
}
}
}
template <class charT>
void parseJsonOptions(std::basic_istream<charT>& is, boost::program_options::parsed_options& options)
{
boost::property_tree::basic_ptree<std::basic_string<charT>, std::basic_string<charT>> pt;
boost::property_tree::read_json(is, pt);
parseChildren<charT>(std::basic_string<charT>(), pt, options);
}
template <class charT>
boost::program_options::basic_parsed_options<charT> parse_json_config_file(std::basic_istream<charT>& is, const boost::program_options::options_description& desc, bool allow_unregistered = false)
{
// do any option check here
boost::program_options::parsed_options result(&desc);
parseJsonOptions(is, result);
return boost::program_options::basic_parsed_options<charT>(result);
}
像这样使用它:
po::variables_map vm;
std::ifstream configFileStream(configFilePath_.generic_string());
store(parse_json_config_file(configFileStream, algorithmsDesc_), vm);
notify(vm);
可以使用 boost 程序选项库:http://www.boost.org/doc/libs/1_64_0/doc/html/program_options.html
要在此处读取 json 格式的文件作为输入文件?
或者如果我在 json 中有一些配置,比如文件,我需要自己解析它,例如:http://www.boost.org/doc/libs/1_64_0/doc/html/property_tree.html
It is possible with boost program options library: http://www.boost.org/doc/libs/1_64_0/doc/html/program_options.html
to read json formatted file as an input file here?
不,但是如果你为它写一个Parser Component就可以了
Or if I have some config in json like file, I need to parse it myself, with for example: http://www.boost.org/doc/libs/1_64_0/doc/html/property_tree.html
可以。请务必检查
我遇到了同样的问题。这是我为 program_options 库实现的 JSON 解析器,基于 property_tree:
template <class charT> void parseChildren(std::string prefix, boost::property_tree::ptree& tree, boost::program_options::parsed_options& options)
{
if (tree.size() == 0)
{
//cut first dot
std::basic_string<charT> name = prefix.substr(1);
std::basic_string<charT> value = tree.data();
boost::program_options::basic_option<charT> opt;
opt.string_key = name;
opt.value.push_back(value);
opt.unregistered = (options.description->find_nothrow(name, false) == nullptr);
opt.position_key = -1;
options.options.push_back(opt);
}
else
{
for (auto it = tree.begin(); it != tree.end(); ++it)
{
parseChildren<charT>(prefix + "." + it->first, it->second, options);
}
}
}
template <class charT>
void parseJsonOptions(std::basic_istream<charT>& is, boost::program_options::parsed_options& options)
{
boost::property_tree::basic_ptree<std::basic_string<charT>, std::basic_string<charT>> pt;
boost::property_tree::read_json(is, pt);
parseChildren<charT>(std::basic_string<charT>(), pt, options);
}
template <class charT>
boost::program_options::basic_parsed_options<charT> parse_json_config_file(std::basic_istream<charT>& is, const boost::program_options::options_description& desc, bool allow_unregistered = false)
{
// do any option check here
boost::program_options::parsed_options result(&desc);
parseJsonOptions(is, result);
return boost::program_options::basic_parsed_options<charT>(result);
}
像这样使用它:
po::variables_map vm;
std::ifstream configFileStream(configFilePath_.generic_string());
store(parse_json_config_file(configFileStream, algorithmsDesc_), vm);
notify(vm);