0

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

4

1 回答 1

2

JSONObject正在包装本机 Javascript 对象,因此您必须先获取该包装对象,然后再将其传递给 jsni 方法。

  jsni(object.getJavaScriptObject());

然后在您的 jsni 代码中,您可以处理适当的值:

  public final native jsni(JavaScriptObject parameter) /*-{
     doSomething(parameter.myproperty);
  }-*/;

[已编辑] 要获取 a 的包装对象,JSONValue您必须调用它的getUnwrapper()方法,但它不是公共的,因此您必须从您的 jsni 代码中调用它:

private static native void jsni(JSONValue value) /*-{
  if (value) {
    value =  value.@com.google.gwt.json.client.JSONValue::getUnwrapper()()(value);
    alert(value);
  }
}-*/;
于 2013-10-17T05:42:03.400 回答