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

rbl8hiat  于 2023-03-04  发布在  其他
关注(0)|答案(2)|浏览(176)

我想使用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")
简而言之,整个情况让我很吃惊。我一定是漏掉了什么/我一定是无意中使用了这个库?

kxxlusnw

kxxlusnw1#

我运行了同样的问题,我的解决方案是使用库允许赋值的“隐式”方式:

json x;
x["whatever"] = 3;

这在原则上没有回答您的问题,但可能解决了用例。

wvt8vs2t

wvt8vs2t2#

nlohman是一个非常“现代”的库,它使用了C++中的很多特性。这可能会使代码更难阅读和理解。但它非常灵活。
这个简短的介绍可能对Introduction to nlohmann json有所帮助
将文本解析为json对象的过程如下

constexpr std::string_view stringJson = R"({"k1": "v1"})";
nlohmann::json j = nlohmann::json::parse( stringJson.begin(), stringJson.end() );

相关问题