मैनेज्ड अपवाद कोशिश कर रहा है जब पुनः प्राप्त करने के लिए मूल्य से JSON ptree का उपयोग को बढ़ावा देने के सी++

0

सवाल

मैं हो रही हूँ नीचे त्रुटि को पढ़ने के लिए जब मूल्य से JSON ptree का उपयोग को बढ़ावा देने के सी++

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

नीचे दिए गए कार्यक्रम है, किसी कृपया मेरी मदद करो क्या मैं याद आ रहा हूँ यहाँ.

#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

सबसे अच्छा जवाब

1

वहाँ है एक आकार के बीच बेमेल अपने कोड और अपने डेटा:

  • डेटा एक सादे नेस्टेड शब्दकोश: Student.name है "जॉन".
  • कोड की उम्मीद है देखने के लिए एक सरणी के तहत Student कुंजी है, तो यह कोशिश करने के लिए लाने के Student.0.name, Student.1.name, ... के लिए हर subitem के Student.

या तो तय कोड:

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

या ठीक डेटा:

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

धन्यवाद । @Botje
sas
1

सबसे पहले, मैं सुझाव है कि आधुनिकीकरण और इस प्रकार सरल बनाने के अपने कोड से परहेज करते हुए, using निर्देश:

#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");
    }
}

दूसरी बात, आप का चयन कर रहे हैं गलत के स्तर के रूप में अन्य जवाब के अंक।:

#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";
}

यह देखते रहते हैं

लेकिन असली समस्या यह है:

उपयोग एक JSON पुस्तकालय

को बढ़ावा देने के संपत्ति पेड़ है नहीं एक JSON पुस्तकालय है ।

को बढ़ावा देने JSON मौजूद है:

पर रहते हैं 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";
}

प्रिंट

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

बोनस

के लिए और अधिक गंभीर कोड हो सकता है आप चाहते हैं का उपयोग करने के लिए प्रकार मानचित्रण:

#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";
}
    

इसे देख पर रहते हैं Coliru

2021-11-22 22:33:37

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

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

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में