簡體   English   中英

將任意JSONValue傳遞給JSNI函數

[英]Passing an arbitrary JSONValue to a JSNI function

我的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);
  }
}-*/;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM