如何使用 rapidjson 从对象内部解析 JSON 数组
How to parse JSON array from inside an object with rapidjson
以下是从 Tiled Map Editor 导出的 JSON 文件。
{ "compressionlevel":-1,
"height":32,
"infinite":false,
"layers":[
{
"data":[ A whole bunch of integers in here],
"height":32,
"id":1,
"name":"Tile Layer 1",
"opacity":1,
"type":"tilelayer",
"visible":true,
"width":32,
"x":0,
"y":0
}],
"nextlayerid":2,
"nextobjectid":1,
"orientation":"orthogonal",
"renderorder":"right-down",
"tiledversion":"1.7.2",
"tileheight":32,
"tilesets":[
{
"firstgid":1,
"source":"..\/..\/..\/..\/Desktop\/tileset001.tsx"
}],
"tilewidth":32,
"type":"map",
"version":"1.6",
"width":32
}
在这个 C++ 块中,我试图解析出我实际需要的数据。
std::ifstream inFStream(filePath, std::ios::in);
if(!inFStream.is_open())
{
printf("Failed to open map file: &s", filePath);
}
rapidjson::IStreamWrapper inFStreamWrapper{inFStream};
rapidjson::Document doc{};
doc.ParseStream(inFStreamWrapper);
_WIDTH = doc["width"].GetInt(); //get width of map in tiles
_HEIGHT = doc["height"].GetInt(); //get height of map in tiles
const rapidjson::Value& data = doc["layers"]["data"]; //FAILURE POINT
assert(data.IsArray());
当我编译时,我能够提取 "layers" :[{}]
之外的宽度和高度的正确值
但是,当 const rapidjson::Value& data = doc["layers"]["data"];
被调用时,我收到一个运行时错误,声称 document.h 第 1344 行 IsObject()
断言失败。
我在 rapidjson 网站和其他资源上来回浏览,找不到像这样的东西。
下一步是获取存储在“数据”中的 int 值并将它们推入 std::vector
但在我弄清楚如何访问“数据”之前,这不会发生
doc['layers']
是一个数组。
const rapidjson::Value& layers = doc["layers"];
assert(layers.IsArray());
for (size_t i=0; i < layers.Size(); i++) {
const rapidjson::Value& data = doc["layers"][i]["data"];
assert(data.IsArray());
}
更新:
直接访问 layers
中的第一个 data
项:
const rapidjson::Value& data = doc["layers"][0]["data"];
这只会为您提供 layers
数组中第一项的 data
。如果 layers
至少有一个项目,而您只需要第一个,那么这将始终有效。
以下是从 Tiled Map Editor 导出的 JSON 文件。
{ "compressionlevel":-1,
"height":32,
"infinite":false,
"layers":[
{
"data":[ A whole bunch of integers in here],
"height":32,
"id":1,
"name":"Tile Layer 1",
"opacity":1,
"type":"tilelayer",
"visible":true,
"width":32,
"x":0,
"y":0
}],
"nextlayerid":2,
"nextobjectid":1,
"orientation":"orthogonal",
"renderorder":"right-down",
"tiledversion":"1.7.2",
"tileheight":32,
"tilesets":[
{
"firstgid":1,
"source":"..\/..\/..\/..\/Desktop\/tileset001.tsx"
}],
"tilewidth":32,
"type":"map",
"version":"1.6",
"width":32
}
在这个 C++ 块中,我试图解析出我实际需要的数据。
std::ifstream inFStream(filePath, std::ios::in);
if(!inFStream.is_open())
{
printf("Failed to open map file: &s", filePath);
}
rapidjson::IStreamWrapper inFStreamWrapper{inFStream};
rapidjson::Document doc{};
doc.ParseStream(inFStreamWrapper);
_WIDTH = doc["width"].GetInt(); //get width of map in tiles
_HEIGHT = doc["height"].GetInt(); //get height of map in tiles
const rapidjson::Value& data = doc["layers"]["data"]; //FAILURE POINT
assert(data.IsArray());
当我编译时,我能够提取 "layers" :[{}]
之外的宽度和高度的正确值
但是,当 const rapidjson::Value& data = doc["layers"]["data"];
被调用时,我收到一个运行时错误,声称 document.h 第 1344 行 IsObject()
断言失败。
我在 rapidjson 网站和其他资源上来回浏览,找不到像这样的东西。
下一步是获取存储在“数据”中的 int 值并将它们推入 std::vector
但在我弄清楚如何访问“数据”之前,这不会发生
doc['layers']
是一个数组。
const rapidjson::Value& layers = doc["layers"];
assert(layers.IsArray());
for (size_t i=0; i < layers.Size(); i++) {
const rapidjson::Value& data = doc["layers"][i]["data"];
assert(data.IsArray());
}
更新:
直接访问 layers
中的第一个 data
项:
const rapidjson::Value& data = doc["layers"][0]["data"];
这只会为您提供 layers
数组中第一项的 data
。如果 layers
至少有一个项目,而您只需要第一个,那么这将始终有效。