使用C++读取Lua表并将其放入JSON对象

我正在尝试将一个 Lua 脚本系统与一个 JSON 库进行整合以进行输出,但我遇到了困难。

我希望得到我调用的 Lua 函数返回的内容并将其转换为 JSON(我正在尝试使用 此库),但这个任务很难完成。

这是我迄今为止的最远尝试:

void parseTable(lua_State* L, json& result)
{
    lua_pushnil(L);
    while (lua_next(L, -2) != 0) {
        auto key = lua_tostring(L, -2);
        auto value = parseLuaValue(L);

        result[key] = value;
        lua_pop(L, 1);
    }
}

json parseLuaValue(lua_State* L)
{
    json result;

    auto type = lua_type(L, -1);
    if (type == LUA_TBOOLEAN) {
        result = lua_toboolean(L, -1) != 0;
    } else if (type == LUA_TNUMBER) {
        result = lua_tonumber(L, -1);
    } else if (type == LUA_TSTRING) {
        result = lua_tostring(L, -1);
    } else if (type == LUA_TTABLE) {
        parseTable(L, result);
    };
    lua_pop(L, 1);
    return result;
}

json JSONScriptInterface::callFunction(int params)
{
    json result;
    int size = lua_gettop(m_luaState);
    if (protectedCall(m_luaState, params, 1) != 0) {
        LuaScriptInterface::reportError(nullptr, LuaScriptInterface::getString(m_luaState, -1));
    } else {
        result = parseLuaValue(m_luaState);
    }

    (...)
}

运行的 Lua 脚本是:

function onRequest()
    return {
        ["bool"] = true,
        ["number"] = 50.0,
        ["string"] = "test",
    }
end

这会在 while (lua_next(L, -2) != 0) { 处崩溃,我无法弄清原因。这总是在尝试获取第二个表值时发生,例如 ["number"] = 50.0。第一个可以工作,所以我认为我对栈的操作方式有些错误。

我正在尝试从 这里 中学习正确的方法,但这很难理解。发生错误时会出现以下进程:

PANIC: unprotected error in call to Lua API (invalid key to 'next')
terminate called without an active exception
Signal: SIGABRT (Aborted)

因此,我猜那个消息有些错误。可以猜测,它已经过时了,并且自那以后 Lua API 必须发生了很多变化。我在尝试访问下一个表值时出了什么问题,为什么只会在第二个键上发生?

点赞
用户107090
用户107090

parseLuaValue中,移除

    lua_pop(L, 1);
2015-08-08 06:51:13