Eccezione non gestita durante il tentativo di recuperare il valore del JSON ptree utilizzando Boost C++

0

Domanda

Ricevo il seguente errore durante la lettura del valore da JSON ptree utilizzando Boost C++

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

Di seguito è il programma, qualcuno Potrebbe per favore aiutarmi a quello che mi manca qui.

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

using namespace std;

using boost::property_tree::ptree;

int main()
{
    const char* f_strSetting = "{\"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("Student"))
    {
        std::string l_strColor;
        std::string l_strPattern;
        l_strColor = v.second.get <std::string>("Name");
        l_strPattern = v.second.get <std::string>("Course");
    }
    return 0;
}
boost boost-propertytree c++ json
2021-11-22 13:39:05
2

Migliore risposta

1

C'è una forma di mancata corrispondenza tra il codice e i tuoi dati:

  • I dati di un normale nidificati dizionario: Student.name è "John".
  • Il codice si aspetta di vedere una serie di sotto del Student chiave, in modo che si tenta di recuperare Student.0.name, Student.1.name, ... per ogni elemento secondario di Student.

Correggere il codice:

// Drop the BOOST_FOREACH
auto & l_Student = pt1.get_child("Student");
l_strColor = l_Student.get<std::string>("Name");

o correggere i dati:

// Note the extra []
const char * f_strSetting = R"({"Student": [{"Name":"John","Course":"C++"}]})";
2021-11-22 14:03:27

Grazie. @Botje
sas
1

In primo luogo, mi permetto di suggerire la modernizzazione e semplificando il codice, evitando using direttive:

#include <boost/property_tree/json_parser.hpp>
#include <string>
using boost::property_tree::ptree;

int main() {
    ptree pt;
    {
        std::istringstream l_issJson( R"({"Student": {"Name":"John","Course":"C++"}})");
        read_json(l_issJson, pt);
    }

    for(auto& [k,v] : pt.get_child("Student")) {
        auto name   = v.get<std::string>("Name");
        auto course = v.get<std::string>("Course");
    }
}

In secondo luogo, si sta selezionando sbagliato livelli - come l'altra risposta punti fuori.:

#include <boost/property_tree/json_parser.hpp>
#include <iostream>
#include <string>
using boost::property_tree::ptree;

int main() {
    ptree pt;
    {
        std::istringstream l_issJson( R"({"Student": {"Name":"John","Course":"C++"}})");
        read_json(l_issJson, pt);
    }

    auto name   = pt.get<std::string>("Student.Name");
    auto course = pt.get<std::string>("Student.Course");

    std::cout << "Name: '" << name << "', Course: '" << course << "'\n";
}

Vederlo dal Vivo

Ma il VERO problema è:

UTILIZZARE UNA LIBRERIA JSON

Boost struttura di Proprietà è non una libreria JSON.

Boost JSON esiste:

In Diretta Su Coliru

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

int main() {
    auto pt = json::parse(R"({"Student": {"Name":"John","Course":"C++"}})");

    auto& student = pt.at("Student");
    auto  name    = student.at("Name").as_string();
    auto  course  = student.at("Course").as_string();

    std::cout << "Name: " << name << ", Course: " << course << "\n";
}

Stampe

Name: "John", Course: "C++"

BONUS

Per di più serio di codice si potrebbe desiderare di utilizzare il tipo di mappatura:

#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) {
        return {
            json::value_to<std::string>(v.at("Name")),
            json::value_to<std::string>(v.at("Course")),
        };
    }
};

int main()
{
    auto doc = json::parse(R"({"Student": {"Name":"John","Course":"C++"}})");
    auto s   = value_to<Student>(doc.at("Student"));

    std::cout << "Name: " << s.name << ", Course: " << s.course << "\n";
}
    

Vedere in Diretta Su Coliru

2021-11-22 22:33:37

In altre lingue

Questa pagina è in altre lingue

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