【问题标题】:Parsing an action list from json using rapidjson使用 rapidjson 从 json 解析动作列表
【发布时间】:2017-10-30 16:08:47
【问题描述】:

我正在尝试使用 rapidson 来解析我在游戏硬盘中的关卡定义文件。

关卡定义由一个基本动作和内部的几个但不同的动作组成。

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

示例 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;
}

【问题讨论】:

    标签: c++ factory rapidjson


    【解决方案1】:

    我最终使用此代码转换为 const char *

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多