使用 rapidjson 从 json 解析操作列表

Parsing an action list from json using rapidjson

本文关键字:操作 列表 json rapidjson 使用      更新时间:2023-10-16

我正在尝试使用rapidson来解析我在HDD中为游戏准备的关卡定义文件。

级别定义由基本操作和内部几个但不同的操作组成。

我正在尝试建立一个工厂,该工厂将根据操作的类型创建不同的操作。

示例 JSON:

{
    "actions": [
        {
            "type": "load-board",
            "action": {
                "id": "level_1.1.1",
                "rows": 1,
                "columns": 1,
                "movements": 1,
                "gameBoard": [
                    0 
                ]
            }
        }
    ]
}

但它可以是任何东西,从初始化状态到移动动作,再到负载板。

我想将每个动作封装到不同的动作类中,这些动作类将在 std::future 中执行。

但是我的工厂与我在 Java 中所能做的相去甚远,似乎并非易事,因为传递 rapidjson::GenericValue 将无济于事,因为我需要传递模板所需的参数 .GetString() 方法没有正确的实现。

您是否曾经实现过委派工厂来创建不同的对象和操作?

这是我所期望的:

std::vector<LevelAction *> * GameBoardJsonPacker::unpackLevelActionsJson(std::string json)
{
    std::vector<LevelAction *> * levelActions = new std::vector<LevelAction *>();
    rapidjson::Document document;
    document.Parse<0>(json.c_str());
    auto actions = document["actions"].GetArray();
    for(int i = 0; i < actions.Size(); i++)
    {
        levelActions->push_back(LevelActionFactory::getLevelAction(actions[i].GetString())); //here fails
    }
    return levelActions;
}

我最终使用此代码转换为常量字符*

apidjson::StringBuffer sb;
rapidjson::Writer<rapidjson::StringBuffer> writer( sb );
document["action"].Accept( writer );
sb.GetString();

但是如果不修改 rapidjson 代码,就无法拥有此 GetString 的通用实现