我想使用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;
}
这将产生以下输出:注意,我们必须执行一些仪式,以便使用一个空对象作为默认值(= empty settings),其中= nlohmann::json::object()
;还注意,一旦我们初始化成员值(!),settings对象就改变了它的类型:
{}
[{}]
我的用例非常简单,但是我无法提取设置,除非我显式地检查设置是数组还是对象。
另一件让我担心的事情是错误的代码编译时没有警告,例如,我在JSON数组x
上使用x.value("y")
,该数组包含一个键为"y"
的对象,只有在运行时我才发现我应该使用x.at(0).value("y")
。
简而言之,整个情况让我很吃惊。我一定是漏掉了什么/我一定是无意中使用了这个库?
2条答案
按热度按时间kxxlusnw1#
我运行了同样的问题,我的解决方案是使用库允许赋值的“隐式”方式:
这在原则上没有回答您的问题,但可能解决了用例。
wvt8vs2t2#
nlohman是一个非常“现代”的库,它使用了C++中的很多特性。这可能会使代码更难阅读和理解。但它非常灵活。
这个简短的介绍可能对Introduction to nlohmann json有所帮助
将文本解析为json对象的过程如下