我是读/写JSON文件的初学者。
如何将std::vector<std::vector<Point>>
(C ++数据类型)写入JSON文件,以便在读取创建的JSON后,我可以单独访问每个std::vector<point>
?
请帮忙。
答案 0 :(得分:2)
假设有POD数据结构,您可以使用以下命令对其进行序列化:
struct Point
{
double x, y;
};
Point p;
p.x = 123;
p.y = 456;
std::vector<Point> arr;
arr.push_back(p);
std::vector<std::vector<Point>> container;
container.push_back(arr);
container.push_back(arr);
Json::Value root(Json::arrayValue);
for (size_t i = 0; i != container.size(); i++)
{
Json::Value temp(Json::arrayValue);
for (size_t j = 0; j != container[i].size(); j++)
{
Json::Value obj(Json::objectValue);
obj["x"] = container[i][j].x;
obj["y"] = container[i][j].y;
temp.append(obj);
}
root.append(temp);
}
生成的JSON是:
[
[
{
"x" : 123.0,
"y" : 456.0
}
],
[
{
"x" : 123.0,
"y" : 456.0
}
]
]
您可以作为数组数组访问,就像在C ++中一样。
答案 1 :(得分:0)
你的JSON应该是这样的:
{
"vectorVectors" : [
{
"pointVectors" : [
{ "point": "<some representation of a point>" },
// ...
]
},
// ...
]
}
这样vectorVectors
是Vectors
Vector<Point>
的{{1}}列表,pointVectors
是Vector
的个别元素(包含多个Vector<Point>
} s),point
是Point
的实际代表。
至于如何生成此布局,看起来您可以使用rapidjson,但我不确定 - 我从未使用过它。
答案 2 :(得分:0)
@Sga的答案是正确的,但它缺少对文件的写操作,因此我将用写行的行来报告他的代码(我更改了一些名称)。
在我的情况下, polys
是openCV Point
对象的向量的向量,但它什么都不会改变。
Json::Value polygons(Json::arrayValue);
std::ofstream file_id;
file_id.open(dataFileName);
Json::StyledWriter styledWriter;
for (size_t i = 0; i != polys.size(); i++)
{
Json::Value singlePoly(Json::arrayValue);
for (size_t j = 0; j != polys.at(i).size(); j++)
{
Json::Value pointSingle(Json::objectValue);
pointSingle["x"] = polys.at(i).at(j).x;
pointSingle["y"] = polys.at(i).at(j).y;
singlePoly.append(pointSingle);
}
polygons.append(singlePoly);
}
file_id << styledWriter.write(polygons);
file_id.close();