2013-10-16 67 views
0

我在我的Java中有一个JSONValue,可能是JSONArray,JSONObject,JSONString等。我想将它传递给可以接受任何类型的JSNI函数。如果我天真地写我的JSNI,就像这样:将任意JSONValue传递给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,但这是另一个笨拙的机制。

回答

2

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 = [email protected]::getUnwrapper()()(value); 
    alert(value); 
    } 
}-*/; 
+0

有没有这样的功能,恐怕。你可以调用'isObject()。getJavaScriptObject()',但是如果JSONValue表示一个字符串,一个数字或者null,则不能。 –

+0

http://www.gwtproject.org/javadoc/latest/com/google/gwt/json/client/JSONValue.html –

+0

对不起,我的意思是JSONObject而不是JSONValue,更新了评论。 –