Luaj解析表内容

时间:2015-07-20 18:05:18

标签: java android luaj

我刚开始在我的项目中使用luaj,我想在我的lua表中获取字符串内容。 例如:

t = {
    subTitle = "Haircut",
}
return t;

我想获得副标题的内容,这应该很简单,但我不知道该怎么做。 在我的代码中,我编写了如下示例代码:

public class MainActivity extends ActionBarActivity {

    Globals globals = JsePlatform.standardGlobals();
    TextView textView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView)findViewById(R.id.text);

        try {
            LuaValue chunk = globals.loadfile("assets/Test.lua");
            String text = chunk.get("t").get("subTitle").call().tojstring();
            textView.append(text);
        }
        catch (Exception e)
        {
        }
    }

}

但它一直告诉我get()只能应用于获取功能。我怎样才能获得subTitle的内容?非常感谢你的帮助。

3 个答案:

答案 0 :(得分:1)

返回的块表示编译脚本在执行之前,所以你必须调用()"块一次执行它并获得结果。

也许这个例子更清楚:

Globals globals = JsePlatform.standardGlobals();
LuaValue chunk = globals.load(
    "t = {"+
    "    subTitle = 'Haircut',"+
    "};"+
    "return t");
LuaValue result = chunk.call();  // Executes the chunk and returns 't'
String text = result.get("subTitle").tojstring();
System.out.println(text);

您的脚本也会对(全局)变量进行分配" t"这会在globals表中留下副作用,所以你也可以从 globals 中获得结果(在调用chunk之后):

String text = globals.get("t").get("subTitle").tojstring();
System.out.println(text);

答案 1 :(得分:0)

在Java中加载和串行遍历lua文件。

任意lua文件(test.lua):

return 
{
   myTable = 
   {
      { key1 = "a", ... },
      { key1 = "b", ... },
      { key1 = "c", ..., key5 = {key5.1="d", ...} }
   }
}

java就像这样(Android):

public static void loadLua(InputStream in)
{
    // Loading and serial traversal of a lua file in Java.
    //
    // create an environment to run in
    Globals globals = JsePlatform.standardGlobals();
    LuaValue chunk = globals.load(in, "@"+"test.lua", "bt");
    LuaClosure closure = new LuaClosure(chunk.checkclosure().p, globals); 

    //You must invokink ze closure to get ze data!
    LuaTable table = closure.call().checktable().get("myTable").checktable();

    //Serial traversal to an output stream.
    int l = table.length();
    for (int i =1;i<=l;i++)
    {
        System.out.println("---------------------------------------");
        System.out.println("key1:"+table.rawget(i).get("key1"));
        System.out.println("key2:"+table.rawget(i).get("key2"));
        System.out.println("key3:"+table.rawget(i).get("key3"));
        System.out.println("key4:"+table.rawget(i).get("key4"));

        // Key5 is a nested hash table
        LuaValue key5 = table.rawget(i).get("key5");
        if( !key5.isnil())
        {   
            System.out.println("Key5");
            LuaValue[] keys = key5.checktable().keys();
            for (int j = 0; j<keys.length; j++)
            {
                System.out.println("  ["+keys[j]+"]"+"key5.1:"+key5.checktable().get(keys[j]).get("key5.1"));
                System.out.println("  ["+keys[j]+"]"+"key5.2:"+key5.checktable().get(keys[j]).get("key5.2"));
                System.out.println("  ["+keys[j]+"]"+"key5.3:"+key5.checktable().get(keys[j]).get("key5.3"));
            }
        }
    }
}

编辑:如果有人想留下等效的jSON转换器,我会赞成它。

答案 2 :(得分:0)

假设我们有用lua编写的示例代码:

CREATE TABLE [BI].[DS].[ORDERDATA_TEMP_DELETE] ( ORDERNUMBER decimal(28,0) NOT NULL ); GO


您可以在lua中执行此操作,以仅解析特定数据

t = { subTitle = "Haircut", }

并在Java中检索数据:

function getSubtitle() return t.subTitle end