我在尝试将Lua脚本系统与JSON库集成以进行输出时遇到了困难。
我想得到任何Lua函数我调用返回并将其转换为JSON(我试图使用this lib),但这个任务证明是非常困难的。
到目前为止,这是我最远的尝试:
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
。第一个工作,所以我认为我操纵堆栈有点不对。
我试图用this学习正确的方法,但这很难理解。该过程中止,并显示以下消息:
PANIC: unprotected error in call to Lua API (invalid key to 'next')
terminate called without an active exception
Signal: SIGABRT (Aborted)
所以我猜这个消息在某种程度上是错误的。很容易猜到,它已经11岁了,从那以后Lua API必定会发生很大的变化。在尝试访问下一个表值时获取该中止信号我做错了什么,为什么只在第二个键上发生?
答案 0 :(得分:0)
删除
parseLuaValue
EXISTS
中的。