2012-02-15 69 views
5

我在客戶端使用Google Visualization API,並創建了一個DataTable對象。然後我想將它傳遞給我的服務器,並通過Spreadsheet API將其上傳到電子表格。可能最好的方法是使用JSON,所以我將其轉換爲JSON()方法並通過POST將它發送到我的服務器。我試圖用這2類:將DataTable對象從JavaScript傳遞到Java

現在我注意到,這2類是不兼容的,至少不會超過JSON。該JavaScript類例如轉換成這樣:

{"cols":[ 
     {"id":"Col1","label":"","type":"string"} 
     {"id":"Col2","label":"","type":"date"} 
     ], 
"rows":[ 
     {"c":[{"v":"a"},{"v":"Date(2010,10,6)"}]}, 
     {"c":[{"v":"b"},{"v":"Date(2010,10,7)"}]} 
     ] 
} 

但是Java側DataTable的參數不同的名稱,我使用GSON具有不同類型的數值:

cols -> columns 
c -> cells 
v -> value 

type:"string" -> type:"TEXT" 
type:"number" -> type:"NUMBER" 

我也怕還有更多的不兼容性。

所以..我如何將JavaScript DataTable轉換爲Java對象DataTable?

+0

你可以在一列中有兩個值嗎? :) – supertopi 2012-02-15 22:30:27

+1

這只是一個來自谷歌的示例(JavaScript DataTable的第一個鏈接)。你是對的,我糾正了這個例子,但這不是問題的關鍵;) – lmazgon 2012-02-16 07:25:59

回答

2

我遇到了相反的問題。看起來,Java Datasource Library中的DataTable對象與Google Visualization API中的Javascript DataTable對象不平行。

返回Java數據源庫DataTable對象需要使用JsonRenderer而不是默認序列化。它似乎只是從服務器傳遞到客戶端。我不確定是否可以在另一個方向完成。

@WebService 
@Path("/tables") 
public class DataManager extends GenericManager<db, Long> { 

    @Path("/hello/") 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public DataTable getDataTable() { 
     DataTable data = new DataTable(); 
     ... populate object ... 
     return data; 
    } 

但是,默認序列化返回的Java DataTable對象與Google Visualization API javascript DataTable不同。您無法將其傳遞到GVis圖表。

取而代之,您可以使用JsonRenderer類(see this Google Groups email)將它轉換爲類似Json的字符串,該字符串缺少適度壓縮屬性的引號。

jQuery.ajax({ 
    context: this, 
    type: 'Get', 
    url: url, 
    success: function(data) { 
     var args = eval('('+data+')'); // add parens around the returned string       
     var dataTable = new google.visualization.DataTable(args); 
     ... 
}); 

我沒有看到一種用於去的:

@Path("/hello/") 
    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String getDataTable() { 
     DataTable data = new DataTable(); 
     CharSequence charSequence = JsonRenderer.renderDataTable(dataTable, true, true); 
     return charSequence.toString(); 
    } 

該字符串可以在Javascript中通過用括號包圍被解析,而不是在實施例中的對象的文字符號(see this Google Group forum)中所示與Java Datasource Library DataTable對象相反的方式。 所以不是一個答案,但你並不孤單

0

嗯,我在後端和GWT的前端使用python,並從後端傳遞數據表到前端工作沒有任何問題。 我在後端使用google-visualization-python api來創建DataTable。
解析與下面的代碼完成:

DataTable dataTable = DataTable.create(JSONParser.parseLenient(data).isObject().getJavaScriptObject()); 

我也轉換解析數據表回JSON存儲在localStorage的JSON字符串和解析存儲JSON字符串也能正常工作。

GWT DataTable只是一個簡單的包裝,它最終只是通過JSNI調用底層Javascript DataTable的功能。所以我沒有看到它們應該不兼容的原因。

請確保您使用最新的gwt-visualization API(1.1.2)?

+0

啊哈。有兩個帶有DataTable對象的Java庫:[GWT DataTable](http://code.google.com/p/gwt-google-apis/source/browse/trunk/visualization/visualization/src/com/google/gwt/ visualization/client/DataTable.java?r = 1153)和[Java Datasource Library DataTable](http://code.google.com/apis/chart/interactive/docs/dev/dsl_javadocs/com/google/visualization/datasource/數據表/ DataTable.html)。它看起來像GWT DataTable是Javascript對象的直接模擬,並且數據源庫必須稍作改動。 – prototype 2012-03-09 02:39:50

相關問題