Разбор данных YouTube с помощью C ++ и Jsoncpp - PullRequest
3 голосов
/ 02 марта 2012

Вот пример канала, который я хотел бы проанализировать: https://gdata.youtube.com/feeds/api/users/aniBOOM/subscriptions?v=2&alt=json

Вы можете проверить его с помощью http://json.parser.online.fr/, чтобы увидеть, что в нем содержится.

У меня небольшая проблема при разборе фида данных, предоставленного youtube. Первой проблемой было то, как YouTube предоставил данные, обернутые в поле подачи, и из-за этого я не смог разобрать имя пользователя прямо из исходного файла json, поэтому мне пришлось проанализировать первое поле ввода и сгенерировать из него новые данные Json.

В любом случае, проблема в том, что по какой-то причине оно не включает больше, чем первое имя пользователя, и я не знаю почему, потому что, если вы проверяете этот канал в онлайн-парсере, запись должна содержать все имена пользователей.

`

        data = value["feed"]["entry"];
        Json::StyledWriter writer;
        std::string outputConfig = writer.write( data );
//This removes [ at the beginning of entry and also last ] so we can treat it as a Json data
        size_t found;
        found=outputConfig.find_first_of("[");
        int sSize = outputConfig.size();            
        outputConfig.erase(0,1);
        outputConfig.erase((sSize-1),sSize);

        reader.parse(outputConfig, value2, false);

        cout << value2 << endl;

        Json::Value temp;
        temp = value2["yt$username"]["yt$display"];
        cout << temp << endl;

        std::string username = writer.write( temp );
        int sSize2 = username.size();           
        username.erase(0,1);
        username.erase((sSize2-3),sSize2);

` Но по какой-то причине [] fix также обрезает данные, которые я генерирую, если я распечатываю данные без удаления [], я вижу всех пользователей, но в этом случае я не могу извлечь temp = value2 ["yt $ username" ] [ "уг $ дисплей"];

1 Ответ

3 голосов
/ 22 марта 2012

В JSON скобки обозначают массивы (хорошая ссылка здесь ). Это можно увидеть в онлайн-анализаторе, а также - объекты (элементы с одной или несколькими парами ключ / значение {"key1": "value1", "key2": "value2"}) обозначены синими знаками +/-, а массивы (элементы в скобках, разделенные запятыми [{arrayItem1}, {arrayItem2}, {arrayItem3}]) с красными знаками +/-.

Поскольку запись является массивом, вы должны иметь возможность перебирать их, выполняя что-то вроде этого:

// Assumes value is a Json::Value 
Json::Value entries = value["feed"]["entry"];

size_t size = entries.size();
for (size_t index=0; index<size; ++index) {
    Json::Value entryNode = entries[index];
    cout << entryNode["yt$username"]["yt$display"].asString() << endl;
}
...