Obtention d'une exception lors de la lecture des valeurs à l'aide BOOST_FOREACH à partir du tableau JSON en C++

0

La question

J'obtiens l'erreur ci-dessous lors de la lecture des valeurs à l'aide BOOST_FOREACH:

Unhandled exception at 0x76FCB502 in JSONSampleApp.exe: Microsoft C++ exception: boost::wrapexcept<boost::property_tree::ptree_bad_path> at memory location 0x00CFEB18.

Quelqu'un pourrait-il m'aider comment faire pour lire des valeurs de la matrice avec le ci-dessous au format JSON?

#include <string>
#include <iostream>
#include <boost/property_tree/json_parser.hpp>
#include <boost/foreach.hpp>

using namespace std;

using boost::property_tree::ptree;

int main()
{
const char* f_strSetting = R"({"Class": [{"Student": {"Name":"John","Course":"C++"}}]})";

    boost::property_tree::ptree pt1;
    std::istringstream l_issJson(f_strSetting);
    boost::property_tree::read_json(l_issJson, pt1);

    BOOST_FOREACH(boost::property_tree::ptree::value_type & v, pt1.get_child("Class.Student"))
    {
        std::string l_strName;
        std::string l_strCourse;
        l_strName = v.second.get <std::string>("Name");
        l_strCourse = v.second.get <std::string>("Course");

        cout << l_strName << "\n";
        cout << l_strCourse << "\n";
    }

    return 0;
}
boost boost-propertytree c++ json
2021-11-23 13:32:29
1

La meilleure réponse

1

Vous avez posé une question très semblable hier. Nous vous avons dit de ne pas abuser de l'arborescence des propriétés de la bibliothèque de parser JSON. J'ai même prévu:

Pour les plus sérieux de code, vous pourriez vouloir utiliser le mappage de type

Voici comment vous pouvez développer à partir de cette réponse pour analyser l'ensemble de la matrice dans un vecteur à la fois:

En Direct Sur Coliru

#include <boost/json.hpp>
#include <boost/json/src.hpp> // for header-only
#include <iostream>
#include <string>
namespace json = boost::json;

struct Student {
    std::string name, course;

    friend Student tag_invoke(json::value_to_tag<Student>, json::value const& v) {
        std::cerr << "DEBUG: " << v << "\n";
        auto const& s = v.at("Student");
        return {
            value_to<std::string>(s.at("Name")),
            value_to<std::string>(s.at("Course")),
        };
    }
};

using Class = std::vector<Student>;

int main()
{
    auto doc = json::parse(R"({ "Class": [
            { "Student": { "Name": "John", "Course": "C++" } },
            { "Student": { "Name": "Carla", "Course": "Cobol" } }
        ]
    })");
    auto c = value_to<Class>(doc.at("Class"));

    for (Student const& s : c)
        std::cout << "Name: " << s.name << ", Course: " << s.course << "\n";
}

L'impression

Name: John, Course: C++
Name: Carla, Course: Cobol

J'ai même jeté dans une pratique ligne de débogage dans le cas où vous avez besoin pour aider à comprendre exactement ce que vous obtenez à un certain point:

DEBUG: {"Student":{"Name":"John","Course":"C++"}}
DEBUG: {"Student":{"Name":"Carla","Course":"Cobol"}}
2021-11-23 15:05:58

Dans le cas où vous préférez manuel JSON traversée sans la struct/vecteur: coliru.stacked-crooked.com/a/af3ddd1dac30cbd5
sehe

Salut @sehe, je suis en utilisant read_json avec property_tree. Pouvez-vous m'aider comment faire le manuel JSON traversée à l'aide de read_json et property_tree ( comme dans mon exemple).
sas

Assurez-vous. coliru.stacked-crooked.com/a/d444f8aaf6c611f5 (en gros le même que c'était dans mon âgés de réponse). Ne pas le faire, cependant. Et de lire sur les limites de la "JSON" backend dans Boost Propriété de l'Arbre: boost.org/doc/libs/1_77_0/doc/html/property_tree/...
sehe

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................