【问题标题】:Passing a DataTable object from JavaScript to Java将 DataTable 对象从 JavaScript 传递到 Java
【发布时间】:2023-03-25 22:13:01
【问题描述】:

我在客户端使用 Google 可视化 API,并创建了一个 DataTable 对象。然后我想将它传递到我的服务器并通过电子表格 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?

【问题讨论】:

  • 你能在一列中有两个值吗? :)
  • 这只是谷歌的一个例子(JavaScript DataTable 的第一个链接)。你是对的,我纠正了这个例子,但这不是问题的重点;)

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


【解决方案1】:

我反过来遇到了同样的问题。 Java 数据源库中的 DataTable 对象似乎与 Google 可视化 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 对象的方法。 所以不是一个完整的答案,但你并不孤单

【讨论】:

    【解决方案2】:

    我在后端使用 python,在前端使用 GWT,并将 DataTable 从后端传递到前端可以正常工作。 我在后端使用google-visualization-python api 创建数据表。
    解析通过以下代码完成:

    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) ?

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-07
    • 2014-03-28
    • 2012-03-29
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    相关资源
    最近更新 更多