1

プロジェクトで 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() は get 関数にのみ適用できると私に言い続けました。subTitle のコンテンツを取得するにはどうすればよいですか? 助けてくれてありがとう。

4

3 に答える 3

1

返されるチャンクは、実行前のコンパイル済みスクリプトを表すため、チャンクを一度「call()」して実行し、結果を取得する必要があります。

おそらく、この例はより明確です。

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" への割り当ても行います。これは、グローバル テーブルに副作用を残すため、グローバルから (チャンクを呼び出した後に) 結果を取得することもできます

String text = globals.get("t").get("subTitle").tojstring();
System.out.println(text);
于 2015-07-21T13:41:37.950 に答える
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 コンバーターを残したい場合は、賛成します。

于 2015-10-05T03:18:39.010 に答える