C++ REST SDK (Casablanca) web::json итерация

https://msdn.microsoft.com/library/jj950082.aspx имеет следующий код.

void IterateJSONValue()
{
    // Create a JSON object.
    json::value obj;
    obj[L"key1"] = json::value::boolean(false);
    obj[L"key2"] = json::value::number(44);
    obj[L"key3"] = json::value::number(43.6);
    obj[L"key4"] = json::value::string(U("str"));

    // Loop over each element in the object.
    for(auto iter = obj.cbegin(); iter != obj.cend(); ++iter)
    {
        // Make sure to get the value as const reference otherwise you will end up copying
        // the whole JSON value recursively which can be expensive if it is a nested object.
        const json::value &str = iter->first;
        const json::value &v = iter->second;

        // Perform actions here to process each string and value in the JSON object...
        std::wcout << L"String: " << str.as_string() << L", Value: " << v.to_string() << endl;
    }

    /* Output:
    String: key1, Value: false
    String: key2, Value: 44
    String: key3, Value: 43.6
    String: key4, Value: str
    */
}

Однако в C++ REST SDK 2.6.0 кажется, что в json::value нет метода cbegin. Без него, что может быть правильным способом перебора ключей: значений узла json (значение)?


person daewonyoon    schedule 28.07.2015    source источник


Ответы (1)


Похоже, что указанная вами документация привязана к версии 1.0:

В этом разделе содержится информация о C++ REST SDK 1.0 (кодовое название Casablanca). Если вы используете более позднюю версию с веб-страницы Codeplex Casablanca, используйте местную документацию по адресу http://casablanca.codeplex.com/documentation.

Взглянув на журнал изменений для версии 2.0.0, вы найдете следующее:

Критическое изменение — изменен способ выполнения итерации по массивам и объектам json. Больше не возвращается итератор std::pair‹json::value, json::value›. Вместо этого существует отдельный итератор для массивов и объектов в классах json::array и json::object соответственно. Это позволяет нам улучшать производительность и продолжать вносить соответствующие коррективы. Итератор массива возвращает json::values, а итератор объекта теперь возвращает std::pair‹string_t, json::value›.

Я проверил источник на 2.6.0, и вы правы, для класса значения вообще нет методов итератора. Похоже, вам нужно получить внутреннее представление object из вашего класса value:

json::value obj;
obj[L"key1"] = json::value::boolean(false);
obj[L"key2"] = json::value::number(44);
obj[L"key3"] = json::value::number(43.6);
obj[L"key4"] = json::value::string(U("str"));

// Note the "as_object()" method calls
for(auto iter = obj.as_object().cbegin(); iter != obj.as_object().cend(); ++iter)
{
    // This change lets you get the string straight up from "first"
    const utility::string_t &str = iter->first;
    const json::value &v = iter->second;
    ...
}

Самые последние документы и версии можно найти по ссылке GitHub: https://github.com/microsoft/cpprestsdk

person huu    schedule 28.07.2015