在c++中首次使用json。需要读取某种格式的json文件,并将数据转换为c++结构。我可以像在文档中找到的那样用简单的类型来做,但是对于我定义的类型,我做错了。
为什么不工作?它在我的测试程序中指定的位置崩溃。
struct equupoly
{
std::string name;
std::vector<int> all_points_x;
std::vector<int> all_points_y;
};
void to_json(json& j, const equupoly& p)
{
j = json{ {"name", p.name}, {"all_points_x", p.all_points_x}, {"all_points_y", p.all_points_y} };
}
void from_json(const json& j, equupoly& p)
{
j.at("name").get_to(p.name);
j.at("all_points_x").get_to(p.all_points_x);
j.at("all_points_y").get_to(p.all_points_y);
}
class polyfinding
{
public:
polyfinding()
{}
polyfinding(equupoly p, std::string f)
{
poly = p;
Finding = f;
}
equupoly poly;
std::string Finding;
};
void to_json(json& j, const polyfinding& p)
{
j = json{ {"poly", p.poly}, {"Finding", p.Finding} };
}
void from_json(const json& j, polyfinding& p)
{
j.at("poly").get_to(p.poly);
j.at("Finding").get_to(p.Finding);
}
json ReadJSONfile(CString pn)
{
std::ifstream i(pn);
json j;
i >> j;
return j;
}
void MyTestRoutine()
{
json j = ReadJSONfile("C:\test.json");
polyfinding TheData;
from_json(j, TheData); // crashes here
}
测试文件包含:
[{"all_points_x"[1558、1551、1470、1432、1555),"all_points_y":[1337、1478、1474、1390、1340),"name":"polygon"},{"Findings"Fragment"]
将我的代码改为如下.....
struct equupoly
{
std::string name;
std::vector<int> all_points_x;
std::vector<int> all_points_y;
};
void to_json(json& j, const equupoly& p)
{
j = json{ {"name", p.name}, {"all_points_x", p.all_points_x}, {"all_points_y", p.all_points_y} };
}
void from_json(const json& j, equupoly& p)
{
j.at("name").get_to(p.name);
j.at("all_points_x").get_to(p.all_points_x);
j.at("all_points_y").get_to(p.all_points_y);
}
struct findings
{
std::string Findings;
};
void to_json(json& j, const findings& p)
{
j = json{ {"Findings", p.Findings} };
}
void from_json(const json& j, findings& p)
{
j.at("Findings").get_to(p.Findings);
}
class polyfinding
{
public:
polyfinding()
{}
polyfinding(equupoly p, findings f)
{
poly = p;
found = f;
}
equupoly poly;
findings found;
};
void to_json(json& j, const polyfinding& p)
{
j = json{ {"poly", p.poly}, {"found", p.found} };
}
void from_json(const json& j, polyfinding& p)
{
j[0].get_to(p.poly);
j[1].get_to(p.found);
}
json ReadJSONfile(CString pn)
{
std::ifstream i(pn);
json j;
i >> j;
return j;
}
void MyTestRoutine()
{
json j = ReadJSONfile("C:\test.json");
polyfinding TheData;
from_json(j, TheData); // no more crash here
}
感谢cycxyz的宝贵意见!
line崩溃j.at("poly").get_to(p.poly);
您的测试文件包含2个对象的数组:
{"all_points_x":[1558,1551,1470,1432,1555],"all_points_y":[1337,1478,1474,1390,1340],"name":"polygon"}
和
{"Findings":"Fragment"}
当你试图执行j.at("poly")
时,你期望什么?
在这种情况下,您可以使用,例如j[0].get_to(p.poly)
。小心,在你的代码变量名是Finding
,但在json字段名Findings