使用Boost ptree将JSON数组解析为std :: string

时间:2015-07-10 16:03:31

标签: c++ boost

我有这个代码,我需要解析/或将JSON数组作为std :: string来在应用程序中使用。

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之上的代码只是返回空字符串。可能有什么不对

3 个答案:

答案 0 :(得分:7)

数组表示为具有许多""个键的子节点:

  

<强> 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

答案 1 :(得分:1)

继续@sehe的回答,与@xkm

提出的问题有关
  

是否可以将其设为'[{“name”:“some”},{“name”:“stuffs”}]'

是的,你可以。只需使用“未命名”键来处理它,这意味着键为空字符串。

F.G。

void ManagerFoo()
{
    get_widget()->Foo();         // will be OK, will not compile if declared as "const Widget*"
    get_widget()->FooConst();    // will be OK
}

void ManagerFooConst() const
{
    get_widget()->Foo();         // will NOT be OK
    get_widget()->FooConst();    // will be OK
}

答案 2 :(得分: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;
    }
}