如何使用 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 至少有一个项目,而您只需要第一个,那么这将始终有效。