web-dev-qa-db-fra.com

Utilisation de l'arborescence des propriétés de boost pour lire le tableau int

J'ai du JSON avec une poignée de variables de tableau entiers, comme ceci:

{"a": [8, 6, 2], "b": [2, 2, 1]}

Je voudrais utiliser boost property_tree, par exemple:

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

ss << "{\"a\": [8, 6, 2], \"b\": [2, 2, 1]}";

boost::property_tree::read_json(ss, pt);
std::vector<int> a = pt.get<std::vector<int> >("a");

Cela ne fonctionne pas, ni aucune variation sur un pointeur int que j'ai essayé. Comment lire un tableau dans une arborescence de propriétés?

27
Larry

La prise en charge de JSON est inégale avec l'arborescence des propriétés de boost.

L'ensemble de données de l'arborescence des propriétés n'est pas typé et ne prend pas en charge les tableaux en tant que tels. Ainsi, le mappage d'arborescence JSON/propriété suivant est utilisé:

  • Les objets JSON sont mappés sur des nœuds. Chaque propriété est un nœud enfant.
  • Les tableaux JSON sont mappés à des nœuds. Chaque élément est un nœud enfant avec un nom vide. Si un nœud a à la fois des nœuds enfants nommés et non nommés, il ne peut pas être mappé à une représentation JSON.
  • Les valeurs JSON sont mappées aux nœuds contenant la valeur. Cependant, toutes les informations de type sont perdues; les nombres, ainsi que les littéraux "null", "true" et "false" sont simplement mappés à leur forme de chaîne.
  • Les nœuds d'arborescence de propriétés contenant à la fois des nœuds enfants et des données ne peuvent pas être mappés.

(à partir de la documentation )

Vous pouvez parcourir le tableau avec une fonction d'assistance.

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>

using boost::property_tree::ptree;

template <typename T>
std::vector<T> as_vector(ptree const& pt, ptree::key_type const& key)
{
    std::vector<T> r;
    for (auto& item : pt.get_child(key))
        r.Push_back(item.second.get_value<T>());
    return r;
}

int main()
{
    std::stringstream ss("{\"a\": [8, 6, 2], \"b\": [2, 2, 1]}");

    ptree pt;
    read_json(ss, pt);

    for (auto i : as_vector<int>(pt, "a")) std::cout << i << ' ';
    std::cout << '\n';
    for (auto i : as_vector<int>(pt, "b")) std::cout << i << ' ';
}

Voir Live On Colir. Production:

8 6 2 
2 2 1
24
sehe

Lisez votre liste a comme suit:

#include <boost/foreach.hpp>
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt.get_child("a.")) {
    cout << v.second.data() << endl;
}
13
Derek Illchuk