将DataTable对象从JavaScript传递给Java

时间:2012-02-15 22:14:10

标签: java javascript json google-api google-visualization

我在客户端使用Google Visualization API,并创建了一个DataTable对象。然后我想将它传递给我的服务器并通过Spreadsheet API上传到电子表格。可能最好的方法是使用JSON,因此我使用方法toJSON()将其转换并通过POST将其发送到我的服务器。我尝试使用这两个类:

现在我注意到,这两个类不兼容,至少不是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?

2 个答案:

答案 0 :(得分:2)

我反过来遇到了同样的问题。 Java数据源库中的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图表。

相反,从Java中,您使用JsonRenderer类(see this Google Groups email)将其转换为类似Json的字符串,该字符串缺少针对适度压缩的属性的引号。

    @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):

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);  
         ...
 });

我没有看到与Java数据源库DataTable对象相反的方法。  所以不是一个答案,但你并不孤单

答案 1 :(得分:0)

好吧,我在后端使用python,在前端使用GWT,并将DataTable从后端传递到前端,没有任何问题。 我在后端使用google-visualization-python api来创建DataTable 使用以下代码进行解析:

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

我还将解析后的DataTable转换回JSON以将json字符串存储在localStorage中,并且解析存储的json字符串也可以正常工作。

GWT DataTable只是一个简单的包装器,它最终只通过JSNI调用底层Javascript DataTable的函数。所以我没有看到它们为什么不兼容的原因。

确保使用最新的gwt-visualization API(1.1.2)?