数组或对象:如何在简单的用例中使用nlohmann::json



我想使用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() );

最新更新