Gwt 将任意JSONValue传递给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);

我的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,但这是另一个笨拙的机制。

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