简体   繁体   English

C++ REST SDK (Casablanca) web::json 迭代

[英]C++ REST SDK (Casablanca) web::json iteration

https://msdn.microsoft.com/library/jj950082.aspx has following code. 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
    */
}

However, with C++ REST SDK 2.6.0, it seems that there's no cbegin method in json::value.但是,对于 C++ REST SDK 2.6.0,json::value 中似乎没有 cbegin 方法。 Without it, what could be the right way to iterate through key:values of a json node (value)?没有它,迭代 json 节点(值)的 key:values 的正确方法是什么?

Looks like the documentation you listed is pegged to version 1.0:看起来您列出的文档与版本 1.0 挂钩:

This topic contains information for the C++ REST SDK 1.0 (codename "Casablanca").本主题包含有关 C++ REST SDK 1.0(代号“Casablanca”)的信息。 If you are using a later version from the Codeplex Casablanca web page, then use the local documentation at http://casablanca.codeplex.com/documentation .如果您使用的是 Codeplex Casablanca 网页的更新版本,请使用http://casablanca.codeplex.com/documentation 上的本地文档。

Taking a look at the changelog for version 2.0.0, you'll find this:查看 2.0.0 版的变更日志,您会发现:

Breaking Change - Changed how iteration over json arrays and objects is performed. Breaking Change - 更改了对 json 数组和对象执行迭代的方式。 No longer is an iterator of std::pair<json::value, json::value> returned.不再返回 std::pair<json::value, json::value> 的迭代器。 Instead there is a separate iterator for arrays and objects on the json::array and json::object class respectively.相反, json::array 和 json::object 类上的数组和对象分别有一个单独的迭代器。 This allows us to make performance improvements and continue to adjust accordingly.这使我们能够进行性能改进并继续进行相应的调整。 The array iterator returns json::values, and the object iterator now returns std::pair<string_t, json::value>.数组迭代器返回 json::values,对象迭代器现在返回 std::pair<string_t, json::value>。

I checked the source on 2.6.0 and you're right, there are no iterator methods at all for the value class.我检查了 2.6.0 上的源代码,您是对的,值类根本没有迭代器方法。 It looks like what you'll have to do is grab the internal object representation from your value class:看起来您需要做的是从您的value类中获取内部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"));

// 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;
    ...
}

The most recent documents and versions can be found at GitHub link: https://github.com/microsoft/cpprestsdk最新的文档和版本可以在 GitHub 链接中找到: https : //github.com/microsoft/cpprestsdk

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM