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,但这是另一个笨拙的机制。
有没有这样的功能,恐怕。你可以调用'isObject()。getJavaScriptObject()',但是如果JSONValue表示一个字符串,一个数字或者null,则不能。 –
http://www.gwtproject.org/javadoc/latest/com/google/gwt/json/client/JSONValue.html –
对不起,我的意思是JSONObject而不是JSONValue,更新了评论。 –