[英]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.