LuaJava:使用LuaJava将整个Lua表导入类Java数组
我真的被困在这里了,搜索了我的谷歌屁股,试图用luajava将一个表从lua“导入”到java中的一个数组。。。 现在,我已经能够做一些简单的事情,用java打印lua变量,并从表中读取单个元素。。这里一切正常 JAVALuaJava:使用LuaJava将整个Lua表导入类Java数组,java,arrays,lua,lua-table,luajava,Java,Arrays,Lua,Lua Table,Luajava,我真的被困在这里了,搜索了我的谷歌屁股,试图用luajava将一个表从lua“导入”到java中的一个数组。。。 现在,我已经能够做一些简单的事情,用java打印lua变量,并从表中读取单个元素。。这里一切正常 JAVA LuaState L = LuaStateFactory.newLuaState(); L.openLibs(); L.LdoFile("data/test.lua"); L.getGlobal("x"); //I want to read lua-variable x Lua
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循环,但由于它还不是iterable或“真实”数组,所以这是不可能的。。
只需输出obj
就会告诉我这是一个lua表,我用.getObject尝试了很多愚蠢的东西,没有成功。然后我读了一些关于proxies和.pcall的内容(这看起来像是将Java中的值传递给lua中的函数,这不是我想要的)
在(非常糟糕的)文档化javadoc中找不到任何东西,所以我希望有人对此有经验。。可能真的很简单,但很难找到相关信息。
真的很高兴有关于这个的任何信息
p、 我无法更改原始lua文件(稍后),但该文件将只包含一个大表。lua是一种动态语言,表是其唯一的数据结构。表可以包含键/值对的任意组合,这与Java的静态类型不同。因此,您需要创建一个转换函数,该函数将从Lua表创建Java对象。这不是LuaJava自动提供的 如果要使用从Lua表中获取的数据填充Java类,基本上有以下选项:
getField
调用类
,创建该类的新实例,并与一起使用以迭代Lua表并填写必要的Java字段如果您只打算在一种类型的Lua表上使用转换,我建议您使用第一个选项。缺点是每次更改结构时,都必须更新转换代码。第二种方法也有缺点,例如,您应该如何处理缺少/额外键、子表等情况。Lua是一种动态语言,表是它唯一的数据结构。表可以包含键/值对的任意组合,这与Java的静态类型不同。因此,您需要创建一个转换函数,该函数将从Lua表创建Java对象。这不是LuaJava自动提供的 如果要使用从Lua表中获取的数据填充Java类,基本上有以下选项:
getField
调用类
,创建该类的新实例,并与一起使用以迭代Lua表并填写必要的Java字段如果您只打算在一种类型的Lua表上使用转换,我建议您使用第一个选项。缺点是每次更改结构时,都必须更新转换代码。第二种方法也有缺点,例如,您应该如何处理缺少/额外键、子表等情况。好的,到目前为止,这似乎有点超出我的理解,但我会尝试一下。。因此,由于我的lua表是动态的(其中有用户名),我不能使用getField访问它们,所以1。我猜这不是一个选择?!反射对我来说是全新的,乍一看有点太复杂了。。我会尝试使用LdoString,让lua中的一个循环填充我从java发送的一个表,不知道这是否可行,但我会尝试一下。。不过谢谢你的回复,也许我可以比我想象的更容易进行反思,我们拭目以待;)Java反射不是微不足道的。我所说的“手动”是指你应该像这样写出所有的作业:
datad=newdata();L.getField(idx,“名称”);d、 名称=L.toString(L,-1);L.getField(idx,“版本”);d、 version=L.toString(L,-1)代码>之后别忘了清理Lua堆栈:)好吧,那我就不反思了;)但是如果我不知道这些名字是什么,我就无法用getField检索它们。。表总是有相同的名称,但项目是用户名和服务器,我不知道它们到底是什么。。第一行始终为“版本”,第二行始终为“扫描”,但在扫描中,它将存储我在执行时未知的服务器名称。。那么,有什么解决方案吗?顺便说一句,它嵌套在扫描中好几次,我不知道其中任何数据的名称,只是它的外观。好的,到目前为止,这似乎有点超出我的理解,但我会尝试一下。。因此,由于我的lua表是动态的(其中有用户名),我不能使用getField访问它们,所以1。我猜这不是一个选择?!反射对我来说是全新的,乍一看有点太复杂了。。我会尝试使用LdoString,让lua中的一个循环填充我从java发送的一个表,不知道这是否可行,但我会尝试一下。。不过谢谢你的回复,也许我可以比我想象的更容易进行反思,我们拭目以待;)Java反射不是微不足道的。我的意思是