2012-02-15 4 views
5

Sto utilizzando l'API di visualizzazione di Google sul lato client e creo un oggetto DataTable. Quindi voglio passarlo al mio server e caricarlo tramite l'API di Spreadsheet su un foglio di calcolo. Probabilmente il modo migliore è usare JSON, quindi l'ho convertito con il metodo toJSON() e l'ho inviato su POST al mio server. Ho cercato di usare queste 2 classi:Passaggio di un oggetto DataTable da JavaScript a Java

Ora ho notato, che queste 2 classi non sono compatibili, almeno non più di JSON. La classe JavaScript converte ad esempio per questo:

{"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)"}]} 
     ] 
} 

Ma il Java lato DataTable ha nomi diversi per i parametri, e sto usando GSON che ha diversi valori di tipo:

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

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

e temo che ci sono ancora più incompatibilità.

Quindi, come posso convertire il DataTable JavaScript nell'oggetto Java DataTable?

+0

puoi avere due valori in una colonna? :) – supertopi

+1

Questo è solo un esempio di google (primo link per JavaScript DataTable). Hai ragione, ho corretto l'esempio, ma non è questo il punto della domanda;) – lmazgon

risposta

2

Ho incontrato lo stesso problema al contrario. Sembra che l'oggetto DataTable nella libreria di origini dati Java non sia parallelo all'oggetto DataTable Javascript nell'API di visualizzazione di Google.

Restituzione di una libreria di origini dati Java L'oggetto DataTable richiede l'utilizzo di JsonRenderer, anziché la serializzazione predefinita. E sembra funzionare solo passando dal server al client. Non sono sicuro che possa essere fatto nell'altra direzione.

@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; 
    } 

Tuttavia, l'oggetto DataTable Java restituito da serializzazione predefinita non è la stessa cosa che l'API di visualizzazione di Google javascript DataTable. Non puoi passarlo a un grafico di GVis.

Invece, da Java, si utilizza la classe JsonRenderer (see this Google Groups email) per convertirla in una stringa di tipo Json in cui mancano virgolette attorno agli attributi per una compressione modesta.

@Path("/hello/") 
    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String getDataTable() { 
     DataTable data = new DataTable(); 
     CharSequence charSequence = JsonRenderer.renderDataTable(dataTable, true, true); 
     return charSequence.toString(); 
    } 

quella stringa può essere analizzato in Javascript circondando con parentesi, non mostrato nella notazione letterale oggetto negli esempi (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); 
     ... 
}); 

non vedo un metodo per andare il modo inverso all'oggetto DataTable della libreria datasource Java. Quindi non proprio una risposta, ma non sei solo

0

Bene sto usando python sul backend e GWT sul frontend e il passaggio di un DataTable dal backend al frontend funziona senza problemi. Sto utilizzando il google-visualization-python api sul back-end per creare il DataTable.
di analisi viene effettuata con codice seguente:

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

ho anche convertire DataTable analizzato di nuovo a JSON per memorizzare la stringa JSON in localStorage e parsing della stringa JSON memorizzata funziona anche bene.

Il GWT DataTable è solo un semplice wrapper che in definitiva chiama semplicemente la funzione del sottostante Javascript DataTable tramite JSNI.So non vedo alcun motivo per cui dovrebbero essere incompatibili.

Assicurarsi di utilizzare l'ultimo gwt-visualization API (1.1.2)?

+0

Aha. Esistono due librerie Java con oggetti DataTable: [GWT DataTable] (http://code.google.com/p/gwt-google-apis/source/browse/trunk/visualization/visualization/src/com/google/gwt/ visualizzazione/client/DataTable.java? r = 1153) e [Java Datasource Library DataTable] (http://code.google.com/apis/chart/interactive/docs/dev/dsl_javadocs/com/google/visualization/datasource/ DataTable/DataTable.html). Sembra che il GWT DataTable sia un analogo diretto dell'oggetto Javascript e la Datasource Library deve essere convertita con un piccolo sforzo. – prototype