我的Java中有一个JSONValue,它可能是一个JSONArray、一个JSONObject、一个JSONString等等。我想把它传递给一个可以接受这些类型的JSNI函数。如果我天真地把我的JSNI写成这样的话:
public final native jsni(Object parameter) /*-{
doSomething(parameter);
}-*/;
public void useFunction(JSONValue value) {
jsni(value); //Throws js exception at runtime :(
}然后我得到一个javascript异常,因为GWT不知道如何将JSONValue转换为JavaScriptObject (或本机字符串/数字值)。
我目前的解决办法是
public final native jsniForJSO(Object parameter) /*-{
doSomething(parameter);
}-*/;
public final native jsniForString(String parameter) /*-{
doSomething(parameter);
}-*/;
public final native jsniForNumber(double parameter) /*-{
doSomething(parameter);
}-*/;
public actuallyUseFunction(JSONValue value) {
if (value.isObject()) {
jsniForJSO(value.isObject().getJavaScriptObject());
} else if (value.isString()) {
jsniForString(value.isString().stringValue());
} else {
//etc
}
}这是代码可维护性的一大负担,等等.特别是如果您有多个参数。是否有一种方法可以自动生成这些函数,或者完全绕过这个问题?我已经开始在JSONObject中包装所有东西,所以我肯定可以让JavaScriptObject传递给我的jsni,但这是另一个笨拙的机械师。
发布于 2013-10-17 05:42:03
JSONObject正在包装一个原生Javascript对象,所以在将它传递给jsni方法之前,您必须先得到这个包装的对象。
jsni(object.getJavaScriptObject());然后,在jsni代码中,您可以处理适当的值:
public final native jsni(JavaScriptObject parameter) /*-{
doSomething(parameter.myproperty);
}-*/;要获得JSONValue的包装对象,必须调用它的getUnwrapper()方法,但它不是公共的,所以您必须从jsni代码中调用它:
private static native void jsni(JSONValue value) /*-{
if (value) {
value = value.@com.google.gwt.json.client.JSONValue::getUnwrapper()()(value);
alert(value);
}
}-*/;https://stackoverflow.com/questions/19411867
复制相似问题