2012-05-31 49 views
0

我在某種程度上與Autobeans上下文中的數組和JSNI苦苦掙扎。
在我的一個GWT項目中,我使用JSON從後端檢索數據。
一旦在客戶端檢索到數據,我想使用自定義可視化小部件(使用javascript開發)將其可視化。AutoBean,數組/列表屬性和JSNI

以下是部分:

JSON結構

{'ids':[1,2,3,4],'data':[[1.0],[1.0,2.0],[1.0,2.0,3.0] ... ]} 

基本上我有我的JSON有效載荷兩個數據集。 IDS是整數(int[])和數據的陣列是浮筒(float[][]

的陣列的陣列當然也有不同的方式來分析客戶機上的數據。我決定使用AutoBeans。所以我爲我的json結構定義了一個接口。

AutoBean

interface MyData { 
    List<Integer> ids; 
    List<List<Float>> data; 
} 

分析數據工作正常。

我定製的可視化部件有一個API函數來設置,看起來像這樣的數據:

function api_setData(ids,data) { 
    //ids should be an Array of Ints 
    //data should be an array of array of Floats. 
} 

的問題是,與JSNI我不能正常使用Java數組。我必須使用JsArray

public final native void setData(JsArrayInteger ids,JsArray<JsArrayInteger> data /*-{ 
     this.api_setData(ids,data); 
    }-*/; 

所以,我必須將我AutoBean屬性(數據IDS)到JsArray實例。 有沒有更好的/更好的方法來做到這一點?

或者我應該使用JSONParser而不是AutoBeans 更高效嗎?

回答

3

如果您必須處理JSNI,而且如果您僅在客戶端使用您的MyData接口,則不要使用AutoBeans。使用JSON覆蓋代替:

public class MyData extends JavaScriptObject { 
    protected MyData() { /* required for JSOs */ } 

    public final native JsArrayInteger getIds() /*-{ return this.ids; }-*/; 

    public final native JsArray<JsArrayNumber> getData() /*-{ return this.data; }-*/; 
} 

然後解析您的JSON:

MyData data = JsonUtils.safeEval(jsonStr); 
customVisualizationWidget.setData(data.getIds(), data.getData()); 

或者,假設你只需要你分析數據使用setData,然後只需使用JavaScriptObject

在窗口小部件:

public final native void setData(JavaScriptObject obj) /*-{ 
    this.api_setData(obj.ids, obj.data); 
}-*/; 

當你需要解析JSON,並給它的小部件:

customVisualizationWidget.setData(JsonUtils.safeParse(jsonStr)); 
+0

感謝托馬斯的反饋。 我懷疑AutoBean可能不適合我的使用案例。我想從性能的角度來看,JSO和AutoBean應該同樣快(我的數據數組可能有200k浮點值)。 –

+0

JSO將始終比AutoBean執行得更好,因爲AutoBeans具有JSO包裝。他們非常認爲封裝,只是根據需要進行實例化,所以它通常不是問題;但仍然。 –