c++ - 如何使用boost属性树使用boost解析json字符串中数组中的元素?

标签 c++ arrays json boost boost-propertytree

我有一个如下所示的 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;
}

最佳答案

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

{
    "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 block 中,因为 boost 属性树在出现问题的第一个迹象时会抛出异常(例如解析失败或未找到字段等)

您可能会考虑使用更加用户友好的 json 库 ( https://github.com/nlohmann/json )。

关于c++ - 如何使用boost属性树使用boost解析json字符串中数组中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50407331/

相关文章:

C++ remove_if 无需迭代整个 vector

c++ - 使用模板将类方法绑定(bind)到特定原型(prototype)

c++ - 将 ostream 作为引用传递时出现段错误

Ruby,如何获取数组元素的特定百分比

c++ - 将两个字符串中的相似性写入新动态数组的最简单方法

java - 从 servlet 创建自定义 json

c++ - 如何从 DWORD 构造 std::string?

C++,计算字符串中重复的单词并显示

javascript - 从给定键的 JSON 中获取值,其中父键名称是动态的

python - 如何将 SqlAlchemy 结果序列化为 JSON?