Gwt 将任意JSONValue传递给JSNI函数
我的Java中有一个JSONValue,它可能是一个JSONArray、一个JSONObject、一个JSONString等等。我想把它传递给一个可以接受任何这些类型的JSNI函数。如果我天真地将我的JSNI写为:Gwt 将任意JSONValue传递给JSNI函数,gwt,jsni,Gwt,Jsni,我的Java中有一个JSONValue,它可能是一个JSONArray、一个JSONObject、一个JSONString等等。我想把它传递给一个可以接受任何这些类型的JSNI函数。如果我天真地将我的JSNI写为: public final native jsni(Object parameter) /*-{ doSomething(parameter); }-*/; public void useFunction(JSONValue value) { jsni(value);
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,但这是另一个笨拙的机制。
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);
}
}-*/;
恐怕没有这样的功能。您可以调用
isObject().getJavaScriptObject()
,但如果JSONValue表示字符串、数字或null,则不能调用。很抱歉,我是说JSONObject而不是JSONValue,更新了注释。不幸的是,我有一个JSONValue,而不是JSONObject。用一个示例更新了我的响应以打开JSONValue