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

时间:2015-07-28 11:10:24

标签: c++ json rest casablanca

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节点的值(值)?

1 个答案:

答案 0 :(得分:9)

看起来您列出的文档与版本1.0挂钩:

  

本主题包含有关C ++ REST SDK 1.0(代号&#34; Casablanca&#34;)的信息。如果您使用的是Codeplex Casablanca网页中的更高版本,请使用http://casablanca.codeplex.com/documentation上的本地文档。

看一下2.0.0版的更新日志,你会发现:

  

突破变化 - 改变了对json数组和对象执行迭代的方式。不再是std :: pair的迭代器返回。相反,json :: array和json :: object类上的数组和对象分别有一个单独的迭代器。这使我们能够改进性能并继续相应调整。数组迭代器返回json :: values,对象迭代器现在返回std :: pair。

我检查了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;
    ...
}