Передача объекта DataTable из JavaScript в Java - PullRequest
5 голосов
/ 16 февраля 2012

Я использую API визуализации Google на стороне клиента и создаю объект DataTable.Затем я хочу передать его на свой сервер и загрузить через API Spreadsheet в электронную таблицу.Вероятно, лучший способ - использовать JSON, поэтому я преобразовал его методом toJSON () и отправил через POST на мой сервер.Я пытался использовать эти 2 класса:

Теперь я заметил, что эти 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)"}]}
        ]
}

Но DataTable на стороне Java имеет разные имена для параметров, и я использую Gson, который имеет разные значения типа:

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

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

И я боюсь, что есть еще больше несовместимостей.

Итак ... как я могу преобразовать DataTable JavaScript в объект Java DataTable?

Ответы [ 2 ]

2 голосов
/ 27 февраля 2012

Я столкнулся с той же проблемой в обратном порядке. Похоже, что объект DataTable в библиотеке источников данных Java не параллелен объекту Javascript DataTable в API визуализации Google.

Для возврата библиотеки данных источника 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, возвращаемый сериализацией по умолчанию, отличается от javascript DataTable API визуализации Google. Вы не можете передать его на график 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();
    } 

Эту строку можно проанализировать в Javascript, заключив ее в круглые скобки, не показанные в литеральной записи объекта в примерах ( см. Этот форум Группы Google ):

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

Я не вижу способа перехода в обратном направлении к объекту DataTable библиотеки данных Java. Так что не совсем ответ, но вы не одиноки

0 голосов
/ 01 марта 2012

Ну, я использую python на бэкэнде и GWT на фронтэнде, и передача DataTable из бэкэнда на фронтэнд работает без проблем.Я использую google-visualization-python api на сервере для создания DataTable.
Синтаксический анализ выполняется с помощью следующего кода:

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

Я также преобразовываю проанализированный DataTable обратнов JSON для сохранения строки json в localStorage и синтаксического анализа сохраненной строки json также работает нормально.

GWT DataTable - это простая оболочка, которая в конечном итоге просто вызывает функцию базового Javascript DataTable через JSNI. Поэтому я не вижу причин, почему они должны быть несовместимыми.

Убедитесь, что вы используете самую последнюю версию gwt-visualization API (1.1.2)?

...