将DataTable对象从JavaScript传递给Java

lma*_*gon 5 javascript java 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)"}]}
        ]
}
Run Code Online (Sandbox Code Playgroud)

但Java端DataTable有不同的参数名称,我使用的Gson有不同的类型值:

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

type:"string" -> type:"TEXT"
type:"number" -> type:"NUMBER"
Run Code Online (Sandbox Code Playgroud)

而且我担心更多的不兼容性.

那么..我怎样才能将JavaScript DataTable转换为Java对象DataTable?

pro*_*ype 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;
    } 
Run Code Online (Sandbox Code Playgroud)

但是,默认序列化返回的 Java DataTable 对象与 Google Visualization API javascript DataTable 不同。您无法将其传递给 GVis 图表。

相反,您可以在 Java 中使用该类JsonRenderer请参阅此 Google 网上论坛电子邮件)将其转换为类似 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();
    } 
Run Code Online (Sandbox Code Playgroud)

该字符串可以在 Javascript 中通过用括号括起来来解析,示例中的对象文字表示法中未显示(请参阅此 Google Group 论坛):

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);  
         ...
 });
Run Code Online (Sandbox Code Playgroud)

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