2013-10-16 94 views
0

我在我的Java中有一個JSONValue,可能是JSONArray,JSONObject,JSONString等。我想將它傳遞給可以接受任何類型的JSNI函數。如果我天真地寫我的JSNI,就像這樣:將任意JSONValue傳遞給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,但這是另一個笨拙的機制。

回答

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 = [email protected]::getUnwrapper()()(value); 
    alert(value); 
    } 
}-*/; 
+0

有沒有這樣的功能,恐怕。你可以調用'isObject()。getJavaScriptObject()',但是如果JSONValue表示一個字符串,一個數字或者null,則不能。 –

+0

http://www.gwtproject.org/javadoc/latest/com/google/gwt/json/client/JSONValue.html –

+0

對不起,我的意思是JSONObject而不是JSONValue,更新了評論。 –