2011-06-20 51 views
1

我是Google Codeing Basics(http://code.google.com/intl/de-DE/webtoolkit/doc/latest/DevGuideCodingBasicsOverlay.html#example-collections)並且認爲:嘿,這可能會比手工解析我的JSON對象更快,更容易使用。GWT - JavaScript Overlay類型和JSON

所以我玩了這個例子,發現它在JsArray被定義在HTML文件中時工作得很好,但我找不到一個解決方案來傳遞一個字符串或Url到函數中,它返回一個覆蓋類型。

所以我想要做的是:

我有這個功能

private native Customer getFirstCustomer(/*TYPE (preferd String)*/ name) /*-{ 
    return (CASTVALUE TO ???) name; 
}-*/; 

要我傳

{"FirstName": "Jimmy"} 

爲字符串,並返回我一個Java對象這樣:

import com.google.gwt.core.client.JavaScriptObject; 
    class Customer extends JavaScriptObject { 
     protected Customer() { } 
     public final native String getFirstName() /*-{ return this.FirstName; }-*/; 
    } 

這可能嗎?

最好的問候, 斯特凡

回答

6

請,不這樣做,通過任何手段,eval()東西盲目!(安全101)

使用GWT的JsonUtils相反:它會在支持它(比eval()更快,更安全)和eval()在別人荷蘭國際集團之前,將驗證JSON瀏覽器使用原生JSON支持(也就是IE6, IE7和舊的Safaris -pre 4.0.3-,沒有原生JSON的所有其他瀏覽器版本現在已經死了):

Customer customer = JsonUtils.safeEval(jsonString); 
+0

我會添加JsonUtils到我的帖子:)(我沒有包括任何安全警告在它中...我假設json字符串事先被控制) – helios

1

如果你有一個JSON字符串,以創建javscript對象,you must eval it

private native Customer getFirstCustomer(String jsonString) /*-{ 
    return eval(jsonString); 
}-*/; 

如果你的本地方法返回的Customer類(必須擴展JavaScriptObject )它會被自動鑄造(Java編譯器會接受它,在JS中它不需要強制轉換)。

也參見this reference

重要安全更新:

感謝Thomas Broyer

不要直接使用eval。使用JsonUtils.safeEval(String)API)。它將避免執行可能出現在字符串中的不安全的JavaScript代碼。

private native Customer getFirstCustomer(String jsonString) /*-{ 
    return JsonUtils.safeEval(jsonString); 
}-*/; 
+1

哇,這個簡單,我愛它:)。 – Stefan

+0

是的。 GWT就是這樣。 – helios

+0

謝謝,在這種情況下,它必須去托馬斯....我在晚上也想知道它...... – Stefan