尝试使用 Boost C++ 从 JSON ptree 检索值时出现未处理的异常
Unhandled exception when trying to retrieve the value from the JSON ptree using Boost C++
我在使用 Boost C++
从 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;
}
您的代码和数据之间存在形状不匹配:
- 数据是普通嵌套字典:
Student.name
是“John”。
- 该代码希望在
Student
键下看到一个数组,因此它会尝试为 Student
的每个子项获取 Student.0.name
、Student.1.name
、... .
要么修改代码:
// 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++"}]})";
首先,我可以建议现代化,从而简化您的代码,同时避免 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";
}
看到了Live
但是真正的问题是:
使用 JSON 图书馆
Boost 属性 树 不是 JSON 库。
提升 JSON 存在:
#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";
}
我在使用 Boost C++
从 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;
}
您的代码和数据之间存在形状不匹配:
- 数据是普通嵌套字典:
Student.name
是“John”。 - 该代码希望在
Student
键下看到一个数组,因此它会尝试为Student
的每个子项获取Student.0.name
、Student.1.name
、... .
要么修改代码:
// 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++"}]})";
首先,我可以建议现代化,从而简化您的代码,同时避免 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";
}
看到了Live
但是真正的问题是:
使用 JSON 图书馆
Boost 属性 树 不是 JSON 库。
提升 JSON 存在:
#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";
}