2012-04-05 61 views
1

我真的被困在這裏,絕對搜索了我的谷歌屁股,試圖從luajava中將一個表從lua導入到java中的數組中。 .. 現在,我已經可以做一些簡單的東西,印刷盧阿 - 瓦爾在Java中,並從表中讀取單個元素..這裏的一切工作LuaJava:用LuaJava將整個Lua表導入到類似Java的數組中

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文件(稍後),但該文件只包含一個大表格。

回答

1

Lua是一種動態語言,表是其唯一的數據結構。一個表可以包含鍵/值對的任意組合,這與Java的靜態類型相反。因此你需要創建一個轉換函數,它將從Lua表創建一個Java對象。這不是由LuaJava自動提供的。

如果你要填寫一個Java POD類從一個Lua表中獲得數據,你基本上有以下選擇:

  1. 做手工(最簡單的) - 創建一個簡單的功能,需要一個Lua棧索引,期望在該索引處有一個Lua表,然後創建一個POD類的Java實例並手動填充數據,也就是說,您需要輸入所有必需的getField調用。

  2. 使用Java反射(更通用) - 轉換函數有一個Lua棧的索引和一個Java Class,創建一個類的新實例,並結合使用Java reflectionlua_next遍歷的Lua表並填寫必要的Java領域。

如果您只打算在一種類型的Lua表上使用轉換,我建議您使用第一個選項。缺點是每次更改結構時,都必須更新轉換代碼。第二種方法也有缺點,例如,你應該如何處理丟失/額外鍵,子表等的情況。

+0

好吧,到目前爲止,這似乎有點高於我的頭,但我會試一試。所以,因爲我的lua-table有點動態(有用戶名),所以我不能使用getField來訪問它們,所以1.不是我選擇的選項?反思對我來說是全新的,一見鍾情似乎有點複雜..我會嘗試使用LdoString並在lua中創建一個循環,填充一張我從java發送的表格,不知道該如何工作,但我會給它一個鏡頭..感謝您的答覆,但是,也許我可以更容易地進行反思我想,我們會看到;) – bengalo 2012-04-05 15:18:33

+0

Java Reflection *不是微不足道的。我的意思是「手動」,你應該寫出所有這樣的賦值:'Data d = new Data(); L.getField(idx,「name」); d.name = L.toString(L,-1); L.getField(idx,「version」); d.version = L.toString(L,-1); ...'並且不要忘記清理Lua堆棧之後:) – 2012-04-05 17:49:30

+0

好吧,那時我沒有反思;)但是如果我不知道名字是什麼,我無法用getField檢索它們..桌子總是有相同的名稱,但項目是用戶名和服務器,我不知道他們是什麼。第一行總是'版本',第二個總是'掃描',但在掃描中它將存儲當時未知的服務器名稱執行..所以,任何解決方案呢? – bengalo 2012-04-05 18:48:18