首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用rapidjson从对象内部解析JSON数组

如何使用rapidjson从对象内部解析JSON数组
EN

Stack Overflow用户
提问于 2022-01-23 00:29:51
回答 1查看 1.1K关注 0票数 0

下面是从贴图编辑器导出的JSON文件。

代码语言:javascript
运行
复制
{ "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++块中,我试图解析出我实际需要的数据。

代码语言:javascript
运行
复制
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,但在我找到如何访问“数据”之前,这是不可能发生的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-23 00:39:01

doc['layers']是一个数组。

代码语言:javascript
运行
复制
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中的第一个layers

代码语言:javascript
运行
复制
const rapidjson::Value& data = doc["layers"][0]["data"];

这只为data数组中的第一个项提供了layers。如果layers至少有一项,而您只需要第一项,那么这将始终有效。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70818266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档