将任意JSONValue传递给JSNI函数

时间:2013-10-16 19:17:33

标签: gwt jsni

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

1 个答案:

答案 0 :(得分: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 =  value.@com.google.gwt.json.client.JSONValue::getUnwrapper()()(value);
    alert(value);
  }
}-*/;