Как использовать дерево свойств boost для анализа элементов массива в строке json с помощью boost? - PullRequest
0 голосов
/ 18 мая 2018

У меня есть строка 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;
}

1 Ответ

0 голосов
/ 18 мая 2018

Вам нужно будет присвоить массиву имя, чтобы на него можно было сослаться:

{
    "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"))
        {

        }
    }
}

С этим типом кода вы можете перебирать поля в бла, но так как они разных типов, не просто проанализировать.

Я бы посоветовал вам подумать об именовании полей, чтобы ониможно напрямую ссылаться.

например,

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

Пожалуйста, не забудьте обернуть этот код в блок trycatch, так как деревья свойств boost генерируют исключения при первых признаках проблемы (например, ошибка разбора,или поле не найдено и т.

...