Почему я не могу использовать оператор [] для доступа к массиву в библиотеке C ++ JSON от nlohmann?

я использую этот Библиотека JSON для C ++ для получения информации из API Twitter, которая возвращает массив JSON моей программе (которую я храню в responseData). Но когда я пытаюсь получить доступ к «имени» в возвращенном массиве, это не позволяет мне.

Вот ошибка, которую я получаю после завершения процесса:

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";
}

3

Решение

Я почти ничего не знаю о 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<> объект. Вот как реализована цепочка операторов, и сама цепочка является типичной конструкцией. Та же идея используется в operator<<() из std::cin,

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]