2015-05-20 176 views
1

我正在與cpp一起構建一個項目。
JSON_Spirit:如何獲得價值

我的項目需要一個文件來做一些配置,我決定使用JSON格式的文件。這裏有一個例子:

{ 
    "agentname":"agent1", 
    "server":[ 
     {"ip":"192.168.0.1"}, 
     {"port":"9999"} 
    ]  
} 

現在我需要讓我用JSON_Spirit閱讀該文件。這裏是我的代碼:

ifstream conf("config", ios::in); 
json_spirit::mValue mvalue; 
json_spirit::read(conf, mvalue); 
json_spirit::mObject obj = mvalue.get_obj(); 
string agentname = obj.find("agentname")->second.get_str(); 

代碼後,我可以得到agentname
但我不知道如何獲得ipport
我已經試過這樣:

string ip = obj.find("server")->second.find("ip")->second.get_str(); 

我想應該是這樣的,但上面的代碼不起作用。

回答

0

我發現,使用json_spirit它有助於獲得一些實用程序訪問器函數。此外,應注意檢查該文件的實際內容:

這將工作:

#include <json_spirit.h> 
#include <iostream> 
#include <sstream> 

using namespace std; 

const string test_str = 
R"json({ 
    "agentname":"agent1", 
    "server":[ 
      {"ip":"192.168.0.1"}, 
      {"port":"9999"} 
    ] 
} 
)json"; 

json_spirit::mValue read_document(std::istream& is) { 
    json_spirit::mValue result; 
    auto ok = json_spirit::read(is, result); 
    if (!ok) { 
     throw std::runtime_error { "invalid json" }; 
    } 
    return result; 
} 

const json_spirit::mValue& get_object_item(const json_spirit::mValue& element, const std::string& name) 
{ 
    return element.get_obj().at(name); 
} 

const json_spirit::mValue& get_array_item(const json_spirit::mValue& element, size_t index) 
{ 
    return element.get_array().at(index); 
} 

int main() 
{ 
    istringstream conf(test_str); 

    auto doc = read_document(conf); 

    const auto& agentname = get_object_item(doc, "agentname"); 
    const auto& server = get_object_item(doc, "server"); 
    const auto& ip_holder = get_array_item(server, 0); 
    const auto& ip = get_object_item(ip_holder, "ip"); 
    const auto& port = get_object_item(get_array_item(server, 1), "port"); 

    cout << agentname.get_str() << endl 
    << ip.get_str() << endl 
    << port.get_str() << endl; 

    return 0; 
} 

預期輸出:

agent1 
192.168.0.1 
9999