使用结构化c++类型与nlohmann/JSON



在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

最新更新