首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将任意JSONValue传递给JSNI函数

将任意JSONValue传递给JSNI函数
EN

Stack Overflow用户
提问于 2013-10-16 19:17:32
回答 1查看 861关注 0票数 0

我的Java中有一个JSONValue,它可能是一个JSONArray、一个JSONObject、一个JSONString等等。我想把它传递给一个可以接受这些类型的JSNI函数。如果我天真地把我的JSNI写成这样的话:

代码语言:javascript
复制
public final native jsni(Object parameter) /*-{
    doSomething(parameter);
}-*/;

public void useFunction(JSONValue value) {
    jsni(value);  //Throws js exception at runtime :(
}

然后我得到一个javascript异常,因为GWT不知道如何将JSONValue转换为JavaScriptObject (或本机字符串/数字值)。

我目前的解决办法是

代码语言:javascript
复制
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,但这是另一个笨拙的机械师。

EN

回答 1

Stack Overflow用户

发布于 2013-10-17 05:42:03

JSONObject正在包装一个原生Javascript对象,所以在将它传递给jsni方法之前,您必须先得到这个包装的对象。

代码语言:javascript
复制
  jsni(object.getJavaScriptObject());

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

代码语言:javascript
复制
  public final native jsni(JavaScriptObject parameter) /*-{
     doSomething(parameter.myproperty);
  }-*/;

要获得JSONValue的包装对象,必须调用它的getUnwrapper()方法,但它不是公共的,所以您必须从jsni代码中调用它:

代码语言:javascript
复制
private static native void jsni(JSONValue value) /*-{
  if (value) {
    value =  value.@com.google.gwt.json.client.JSONValue::getUnwrapper()()(value);
    alert(value);
  }
}-*/;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19411867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档