我真的被困在这里,绝对搜索我的谷歌,试图从lua“导入”一个表到java中的数组与luajava ... 现在,我已经能够做一些简单的事情了,在java中打印lua-vars并从表中读取单个元素..一切都在这里工作
JAVA
LuaState L = LuaStateFactory.newLuaState();
L.openLibs();
L.LdoFile("data/test.lua");
L.getGlobal("x"); //I want to read lua-variable x
LuaObject obj = L.getLuaObject(L.getTop()); //So I get the top-element here
System.out.println(obj.getField("Version"));
LUA
x = { ["Version"] = 1.3,["Scans"] = 3 }
现在,这对于检索单个值来说显然相当容易,但是我想把整个对象变成Java(作为一个数组或其他什么),所以我可以用它来做一些事情。
我尝试循环遍历LuaObject,但由于它不是可迭代的或者是“真正的”数组,这是不可能的..
简单地输出obj
会告诉我它是一个lua表,我用.getObject尝试了很多愚蠢的东西,没有成功。然后我读了一些关于代理和.pcall的东西(看起来它是用于将Java中的值传递给lua中的函数,这不是,我想要的)
无法在(非常非常糟糕的)记录的javadoc中找到任何东西,所以我希望有人有这方面的经验..可能很容易但很难找到信息。
对此有任何信息真的很高兴!
P.S。我无法更改原始的lua文件(稍后),但该文件只包含一个大表..
答案 0 :(得分:1)
Lua是一种动态语言,表是唯一的数据结构。表可以包含键/值对的任意组合,这与Java的静态类型形成对比。因此,您需要创建一个转换函数,该函数将从Lua表创建一个Java对象。 LuaJava不会自动提供此功能。
如果要使用从Lua表中获取的数据填写Java POD类,您基本上可以使用以下选项:
手动(最简单) - 创建一个简单的函数,它接受一个Lua堆栈索引,在该索引处需要一个Lua表,然后创建一个POD类的Java实例并手动填充数据,即您需要输入所有必需的getField
来电。
使用Java反射(更通用) - 转换函数采用Lua堆栈索引和Java Class
,创建该类的新实例并使用{{3与Java reflection一起迭代Lua表并填写必要的Java字段。
如果您只想在一种Lua表上使用转换,我建议您使用第一个选项。缺点是每次更改结构时,都必须更新转换代码。第二种方法也存在缺点,例如,如何处理缺失/额外密钥,子表等的情况。