0

更新:プレーンな JavaScript オブジェクトを「JSON オブジェクト」と命名するのが間違っていました。以下のコメントで指摘してくれた人たちに感謝します。そこで、さらなる誤解を避けるために質問を編集しました。

Javaからnetscape.javascript.JSObjectを使って、JavaScriptオブジェクト(JSON文字列として記述できるもの)を引数としてJavaScript関数を呼び出すことができるのだろうか。次のコード スニペットを試しました。

JSObject.getWindow(MyApplet.this).call(jsFunctionName, jsArgs);

この記事によると、 Java オブジェクトはそのまま名前付き JavaScript 関数に渡され、使用されるコンテキストに応じて自動的にいくつかの JavaScript プリミティブに変換されます。JSON 文字列として記述された実際の JavaScript オブジェクトをJavaScript 関数であり、JSON 文字列をjava.lang.StringJava で引数として準備し、それを JavaScript 関数で解析してプレーンな JavaScript オブジェクトを取得するなどの回避策を探す必要がありますか?

4

1 に答える 1

2

«19.3LiveConnectデータ変換»の章を参照することをお勧めします。

渡されるすべてのオブジェクトは、 JavaObjectラッパーjsArgsでラップされます。実際、これは同じJavaScriptオブジェクトであり、基になるオブジェクトのすべてのパブリックプロパティとメソッドを使用できます。


たとえば、次のJavaクラスがある場合:

public class MyJavaClass {
    public String name;
    public int number;
    public MyJavaClass(String n, int i) {
        name = n;
        number = num;
    }
}

そしてJavaScript関数を呼び出します:

JSObject.getWindow(MyApplet.this).call("abFunc", new MyJavaClass("Kolya", 500));

JavaScript関数は次のようになります。

var abFunc = function(obj){
    numberPlusThousand = (1000 + obj.number);
    name = String(obj.name);
    ...
};

また、必要に応じて、他のJavaScriptオブジェクトと同じようにJSON文字列に変換できます。


関数に引数として渡されたJSObjectクラスのインスタンスはcall、対応するJavaScriptオブジェクトに変換されます。したがって、JavaScriptコードでJavaObjectインスタンスが発生しないようにする場合は、次のような新しいJSObjectインスタンスを作成してみてください。

JSObject myJsObj = (JSObject) JSObject.eval("{}");

そして、新しいプロパティを追加します。

myJsObj.setMember("name", JSObject.eval("'Kolya'"));
myJsObj.setMember("number", 500);

またはこのように:

myJsObj.eval("self.name = 'Kolya'");
myJsObj.eval("self.number = 500");

私の考えでは、Java内のJavaScriptオブジェクトをマップとして表現し、 Gsonなどのライブラリを使用してJSON文字列としてJavaScriptに渡し、 JSON.parse()を使用してJavaScriptオブジェクトに変換する方が便利です。

このGsonの使用法を見てください:

Map m1 = ImmutableMap.of("id", "Kolya", "num", 500);
Map m2 = ImmutableMap.of("marks", new byte[] {5, 4, 5, 3});
Map m = ImmutableMap.of("m1", m1, "m2", m2, "l", ImmutableList.of("str", 234L, false));
System.out.println(new Gson().toJson(m));
// {"m1":{"id":"Kolya","num":500},"m2":{"marks":[5,4,5,3]},"l":["str",234,false]}

ImmutableMapグアバライブラリImmutableListからです。

于 2012-10-09T16:35:47.287 に答える