2015-07-10 60 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; 
    } 
}