将DataTable对象从JavaScript传递到Java

问题描述:

我在客户端使用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

我遇到了相反的问题。看起来,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对象相反的方式。 所以不是一个答案,但你并不孤单

嗯,我在后端和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