【问题标题】:How to use boost property tree to parse elements from array in json string using boost?如何使用boost属性树使用boost解析json字符串中的数组元素?
【发布时间】:2018-05-18 08:48:58
【问题描述】:

我有一个如下所示的 json 字符串:

   [
      "some text", 
      648547, 
      94.0, 
      111.0267520223, 
      10
   ]

所以我需要为每个值分配一个变量,例如:

std::string value1 = "some text";
int value2 = 648547;
float value3 = 94.0;
float value4 = 111.0267520223;
int value5 = 10;

为了读取 JSON,使用 Boost,我正在做这样的事情

std::stringstream jsonResponse;
boost::property_tree::ptree pt;

jsonResponse << "[\"some text\", 648547, 94.0, 111.0267520223, 10]";
std::istringstream is(jsonResponse);
boost::property_tree::read_json(is, pt);

但我不知道如何从属性树中读取数组值。

有人知道怎么做吗?

提前致谢!

这是我迭代无命名数组的解决方案:

boost::property_tree::basic_ptree<std::string,std::string>::const_iterator iter = pt.begin(),iterEnd = pt.end();
for(;iter != iterEnd;++iter)
{
    //->first;  // Key.  Array elements have no names 
    //->second; // The object at each step

    std::cout << "=> " << iter->second.get_value<std::string>() << std::endl;
}

【问题讨论】:

    标签: c++ arrays json boost boost-propertytree


    【解决方案1】:

    您需要为数组命名以便引用它:

    {
        "blah": [
            "some text",
            648547,
            94.0,
            111.0267520223,
            10
        ]
    }
    

    这将在 jsonlint.com 上验证,但使用属性树读取仍然不简单。

    #include <boost/property_tree/json_parser.hpp>
    #include <boost/property_tree/ptree.hpp>
    #include <boost/property_tree/exceptions.hpp>
    #include <boost/exception/diagnostic_information.hpp> 
    #include <boost/foreach.hpp>
    
    typedef boost::property_tree::iptree    ptree_t;
    typedef ptree_t::value_type             ptree_value_t;
    typedef boost::optional<ptree_t &>      optional_ptree_t;
    
    
    void parseMyJson()
    {
        optional_ptree_t ptBlah = pt.get_child_optional("blah");
    
        if (ptBlah)
        {
            BOOST_FOREACH (property_tree_t::value_type & field, pt.get_child("blah"))
            {
    
            }
        }
    }
    

    使用这种代码,您可以迭代 blah 中的字段,但由于它们是不同的类型,因此解析起来并不简单。

    我建议您考虑命名这些字段,以便可以直接引用它们。

    例如

    field.second.get<string>("fieldname", "");
    

    请记住将此代码包装在 trycatch 块中,因为 boost 属性树在出现问题的第一个迹象(例如解析失败或未找到字段等)时会抛出异常

    您可能想考虑一个对用户更友好的 json 库 (https://github.com/nlohmann/json)。

    【讨论】:

      猜你喜欢
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 2013-06-12
      • 2012-12-10
      相关资源
      最近更新 更多