2015-07-10 61 views
4

我有這個代碼,我需要解析/或得到的JSON數組作爲std ::字符串將在應用程序中使用。解析JSON數組作爲std :: string與升壓ptree

std::string ss = "{ \"id\" : \"123\", \"number\" : \"456\", \"stuff\" : [{ \"name\" : \"test\" }] }"; 

ptree pt2; 
std::istringstream is(ss); 
read_json(is, pt2); 
std::string id = pt2.get<std::string>("id"); 
std::string num= pt2.get<std::string>("number"); 
std::string stuff = pt2.get<std::string>("stuff"); 

需要的是什麼「東西」像這樣被恢復成的std :: string [{ "name" : "test" }]

然而上述stuff代碼只是返回空字符串。出了什麼問題

+0

[OT]:'SS = R「({‘ID:在這裏使用原始字符串好地方’:」 123 「,」number「:」456「,」stuff「:[{」name「:」test「}]})」'。 – Jarod42

回答

5

陣列都表示爲有許多""鍵子節點:

docs

  • JSON數組被映射到節點。每個元素都是一個空名稱的子節點。如果一個節點同時具有已命名和未命名的子節點,則無法將其映射到JSON表示。

Live On Coliru

#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/json_parser.hpp> 

using boost::property_tree::ptree; 

int main() { 
    std::string ss = "{ \"id\" : \"123\", \"number\" : \"456\", \"stuff\" : [{ \"name\" : \"test\" }, { \"name\" : \"some\" }, { \"name\" : \"stuffs\" }] }"; 

    ptree pt; 
    std::istringstream is(ss); 
    read_json(is, pt); 

    std::cout << "id:  " << pt.get<std::string>("id") << "\n"; 
    std::cout << "number: " << pt.get<std::string>("number") << "\n"; 
    for (auto& e : pt.get_child("stuff")) { 
     std::cout << "stuff name: " << e.second.get<std::string>("name") << "\n"; 
    } 
} 

打印

id:  123 
number: 456 
stuff name: test 
stuff name: some 
stuff name: stuffs 
+0

是否可以像'[{「name」:「some」},{「name」:「stuffs」}]'< - this – xkm

+1

@xkm是的。 'write_json(some_stream,pt.get_child(「stuff」));'。使'some_stream'成爲'std :: ostringstream',這樣你就可以使用'some_stream.str()'來獲取文本 – sehe

0

由於"stuff"是一個數組,可以在它的元件,它們是字典迭代。然後就可以遍歷字典的元素,這些元素的鍵 - 值對:

for (const auto& dict : pt2.get_child("stuff")) { 
    for (const auto& kv : dict.second) { 
     std::cout << "key = " << kv.first << std::endl; 
     std::cout << "val = " << kv.second.get_value<std::string>() << std::endl; 
    } 
}