为什么我不能使用 [] 运算符访问 nlohmann C++ JSON 库中的数组?



我正在使用这个JSON库进行C++,以便从Twitter的API获取信息,该API将JSON数组返回给我的程序(我存储在responseData中)。但是当我尝试访问返回数组中的"name"时,它不允许我这样做。

这是我在进程终止后遇到的错误:

terminate called after throwing an instance of 'nlohmann::detail::type_error'
what():  [json.exception.type_error.305] cannot use operator[] with array

这是我正在处理的代码部分:

if(!responseData.empty()&&response_code==0) {
std::cout<<responseData<<"<---n";
std::cout<<nlohmann::json::parse(responseData.c_str())["name"]<<"<!-n";
}

我对 JSON 知之甚少,这是我第一次遇到上述库,但我觉得这个问题很有趣,而且代码对我来说是一个挑战,所以我会尝试解释我的发现。

发生的情况是,要使用operator[]()按键(而不是索引)访问basic_json<>对象,该对象应为内部类型value_t::object(enum class value_t {})。如果该条件失败,则会引发您看到的异常,并报告对象的实际类型。现在据我了解,对象的类型由解析器根据您传递给它的字符串的语法自动确定。(好吧,据我所知,它可以不仅仅是一个字符串,还有各种实体的重载列表,可以表示线性字符范围。对于以方括号开头的数据,将报告"数组""["

因此,为了确定发生了什么,我们需要查看解析器接收的实际数据。正如我上面提到的,该类型似乎有一个自动扣除,并且每种类型只允许一定范围的操作。要使用键值访问器,看起来字符串应该表示一个对象,并以大括号"{"开头。


给定示例数据:

[
{
"trends":
[
{
"name":"#XboxE3",
"url":"http://twitter.com/search?q=%23XboxE3",
"promoted_content":null,
"query":"%23XboxE3",
"tweet_volume":371447
},
{
"name":"Anthem",
"url":"http://twitter.com/search?q=Anthem",
"promoted_content":null,
"query":"Anthem",
"tweet_volume":71013
}
],
"as_of":"2017-06-11T22:57:57Z",
"created_at":"2017-06-11T22:55:37Z",
"locations":
[
{
"name":"Worldwide",
"woeid":1
}
]
}
]

这似乎是一个分层数据结构,因此要到达"name"元素,您需要下降到它。最上面的元素是一个用[]表示的数组。它包含一个元素 - 一个未命名的对象。我们需要"trends"数组。在该数组中,每个元素又是一个对象。所以我认为查询看起来像这样:

auto response = nlohmann::json::parse(responseData.c_str());
std::cout << response[0]["trends"][0]["name"];

operator[]()应该是可链接的,因为它们返回对basic_json<>对象的引用。这就是运算符链的实现方式,链接本身就是一个典型的设计。同样的想法也用在std::cinoperator<<()中。

最新更新