我想使用nlohmann JSON库来读取JSON文件中的选项。指定选项是可选的,正如我的代码示例中的构造函数所反映的那样。我假设JSON结构的根是一个对象。
不幸的是,我无法使用这些选项,因为我不清楚如何将JSON结构强制为对象。更糟糕的是,仅仅用JSON对象{}
初始化一个成员变量(神奇地?(就会将其变成一个数组[{}]
。
#include <cstdlib>
#include <iostream>
#include <nlohmann/json.hpp>
class Example {
public:
explicit Example(const nlohmann::json& options = nlohmann::json::object())
: m_options{options}
{
std::clog << options << 'n' << m_options << 'n';
}
private:
nlohmann::json m_options;
};
auto main() -> int
{
Example x;
Example y{nlohmann::json::object()};
return EXIT_SUCCESS;
}
这将产生以下输出。请注意,为了使用空对象作为默认值(=空设置(,我们必须执行一些仪式,= nlohmann::json::object()
。还要注意,一旦我们初始化成员值(!(,设置对象就会更改其类型:
{}
[{}]
我的用例非常简单,但我无法提取设置,除非我明确检查设置是数组还是对象。
另一件让我担心的事情是,不正确的代码在没有警告的情况下编译,例如,我在JSON数组x
上使用x.value("y")
的代码,该数组包含一个关键字为"y"
的对象。只有在运行时,我才发现我应该改为执行x.at(0).value("y")
。
简言之,整个情况让我很惊讶。我一定错过了什么/我一定是以一种意想不到的方式使用了这个库?
我遇到了同样的问题,我的解决方案是使用;隐含的";库允许赋值的方式:
json x;
x["whatever"] = 3;
这在原则上不能回答您的问题,但可能可以解决用例。
nlohman是一个非常"现代的";库中,它使用了C++中的许多功能。这可能会使阅读和理解代码变得更加困难。但它非常灵活。
这个简短的介绍可能会有所帮助nlohmann json 简介
将文本解析为json对象的操作类似
constexpr std::string_view stringJson = R"({"k1": "v1"})";
nlohmann::json j = nlohmann::json::parse( stringJson.begin(), stringJson.end() );