2012-02-15 44 views
5

Estoy usando la API de visualización de Google en el lado del cliente y creo un objeto DataTable. Luego quiero pasarlo a mi servidor y subirlo a través de la API de hoja de cálculo a una hoja de cálculo. Probablemente la mejor manera es usar JSON, por lo que lo convertí con el método toJSON() y lo envié a través de POST a mi servidor. He intentado utilizar estas 2 clases:Pasar un objeto DataTable de JavaScript a Java

Ahora me di cuenta, que estas 2 clases no son compatibles, al menos no más de JSON. La clase de JavaScript convierte por ejemplo para esto:

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

Pero el Java del lado del DataTable tiene diferentes nombres para los parámetros, y estoy usando Gson que tiene diferentes valores de tipo:

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

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

y tengo miedo que hay aún más incompatibilidades.

Entonces ... ¿cómo puedo convertir el JavaScript DataTable al objeto Java DataTable?

+0

¿Puedes tener dos valores en una columna? :) – supertopi

+1

Eso es solo un ejemplo de google (primer enlace para JavaScript DataTable). Tienes razón, corregí el ejemplo, pero ese no es el punto de la pregunta;) – lmazgon

Respuesta

2

Me encontré con el mismo problema al revés. Parece que el objeto DataTable en la Biblioteca de fuentes de datos de Java no es paralelo al objeto JavaScript DataTable en la API de visualización de Google.

Devolución de una Biblioteca de origen de Java El objeto DataTable requiere el uso de JsonRenderer, en lugar de la serialización predeterminada. Y parece que solo funciona pasando del servidor al cliente. No estoy seguro si se puede hacer en la otra dirección.

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

Sin embargo, el objeto DataTable Java devuelto por la serialización por defecto no es el mismo que el API de visualización de Google Javascript DataTable. No puede pasarlo a un cuadro de GVis.

En su lugar, desde Java, utiliza la clase JsonRenderer (see this Google Groups email) para convertirla en una cadena similar a Json a la que le faltan comillas en torno a los atributos para la compresión 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(); 
    } 

Esa cadena se puede analizar en Javascript rodeando con paréntesis, que no se muestran en la notación literal de objeto en los ejemplos (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); 
     ... 
}); 

no veo un método para ir al forma inversa al objeto DataTable de la Biblioteca de origen de Java. Así que no es exactamente una respuesta, pero no está solo

0

Bueno, estoy usando python en el backend y GWT en la interfaz y pasando una DataTable desde el backend a la interfaz funciona sin ningún problema. Estoy usando el google-visualization-python api en el back-end para crear el DataTable.
de análisis se realiza con el código siguiente:

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

también convertir el DataTable analizado de nuevo a JSON para almacenar la cadena JSON en localStorage y analizar la cadena JSON almacenado también funciona bien.

El GWT DataTable es simplemente un envoltorio simple que en última instancia simplemente llama a la función del Javascript subyacente DataTable a través de JSNI.Así que no veo ninguna razón por la que deberían ser incompatibles.

Asegúrese de utilizar la última gwt-visualization API (1.1.2)?

+0

Aha. Hay dos bibliotecas Java con objetos DataTable: [GWT DataTable] (http://code.google.com/p/gwt-google-apis/source/browse/trunk/visualization/visualization/src/com/google/gwt/ visualización/cliente/DataTable.java? r = 1153) y [Java Datasource Library DataTable] (http://code.google.com/apis/chart/interactive/docs/dev/dsl_javadocs/com/google/visualization/datasource/ datatable/DataTable.html). Parece que GWT DataTable es un análogo directo del objeto Javascript, y la biblioteca de Datasource debe convertirse con un poco de esfuerzo. – prototype

Cuestiones relacionadas