2015-07-28 68 views
10

https://msdn.microsoft.com/library/jj950082.aspx有以下代碼。C++ REST SDK(Casablanca)web :: json迭代

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節點(值)?

回答

8

看起來你列出的是盯住1.0版本的文檔:

本主題包含了C++ REST SDK 1.0(代號 「卡薩布蘭卡」)的信息。如果您使用的是Codeplex Casablanca網頁的更新版本,請使用http://casablanca.codeplex.com/documentation的本地文檔。

考慮看看更新日誌版本2.0.0,你會發現這一點:

重大更改 - 改變如何進行迭代了JSON數組和對象。不再是std :: pair的迭代器返回。相反,json :: array和json :: object類分別有一​​個單獨的數組和對象迭代器。這使我們能夠提高性能並繼續相應地進行調整。數組迭代器返回json :: values,而對象迭代器現在返回std :: pair。

我在2.6.0上檢查了源代碼,你說得對,值類沒有迭代器方法。看起來你需要做的就是從你的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; 
    ... 
}