Retornar formato específico como JSON en Grails

Saludos a todos:

En Grails podemos retornar en formato JSON la respuesta desde el controlador:

import grails.rest.RestfulController

class ProductoController extends RestfulController {

    static responseFormats = ['json', 'xml']

    ProductoController() {
        super(Producto)
    }  

    def index() {
        respond Producto.list().collect {
            [
               id:it.id,
               descripcion:it.descripcion
            ]
        }
    }  

}

¿ Es la forma más óptima de formatear la respuesta ?
Sabemos que el método list() devuelve una lista de los objetos de dominio, y se itera a través de collect, ¿ Esto conlleva a una penalización en el rendimiento ? Me queda la duda. En espera de sus valiosas respuestas.

Gracias
Saludos cordiales

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

No necesariamente ( en

No necesariamente ( en comparación con otros formatos ) pero tienes que asegurarte que regreses solo los datos necesarios.

Si lo hicieras en otros formato ( o con otro método que no fuera collect ) de todas formas la mayor parte del tiempo estaria en el intercambio de información en la red y no necesariamente en el codificado.

Para no especular, lo mejor que puedes hacer es medir. Ve cuánto se tarda, compararlo con otra forma y toma una decisión. Si el tiempo es insignificante y tienes otras areas donde mejorar el performance ( por ejemplo hacer la consulta correcta a la base de datos, y /o modelar correctamente tus objetos, etc ).

En el contexto del framework ...

Gracias por responder Oscar. ¿ A que otros formatos te refieres ? ¿ Porqué pudieran ser más rápidos que JSON ? ¿ Con cuál otro método diferente a collect sería más óptimo y porqué ? Entiendo que debo hacer la consulta correcta a la base de datos y modelar correctamente mis objetos, pero ese no es el punto. ¿ Podrías postear algún código ? Perdona pero me quedo con más dudas que con soluciones. Nuevamente gracias por tu respuesta.

Saludos cordiales

Imagen de ezamudio

yo lo veo bien

Con el collect estás creando una lista de mapas que es lo que vas a devolver, no tus objetos completos.

JSON es bastante simple y rápido de generar y también de parsear, por eso es tan popular. Más rápido pues solamente algún formato binario o propietario, y la mejora vendría como dice Oscar en la transmisión de datos, no tanto en la codificación.

Me ha quedado claro ...

Gracias Ezamudio, me ha sido de gran ayuda tu respuesta como también la de Oscar. Saludos !

Imagen de rodrigo salado anaya

Collect

¿Esto conlleva a una penalización en el rendimiento?

Nop, collect va iterando de uno en uno (http://groovy.codehaus.org/groovy-jdk/java/util/Collection.html#collect()), tal vez te interese ver el proyecto Gpars (http://gpars.org/1.1.0/guide/index.html)

Yo también lo veo bien, solo que si tienes un millón de productos o más, yo no usaría collect pelón.

http://gpars.org/1.1.0/guide/guide/dataParallelism.html#dataParallelism_...

Interesante el proyecto gpars

Gracias Rodrigo. Interesante el Paralelismo de datos, gracias por la info. En algunos escenarios que se requiera resolverlo mediante procesos asincrónicos. Saludos !

Imagen de ezamudio

millón de datos

Si vas a devolver un millón de datos, yo diría que todo el API está mal. Un navegador no va a poder desplegar un millón de datos, y si pudiera, el humano que lo controla no va a revisar un millón de registros en el navegador, le pongas la interfaz que le pongas.

Lo mismo va para un dispositivo móvil.

Una locura un millón de datos ...

Es correcto Ezamudio, por supuesto que desde el cliente se tomarían los criterios de filtrado, es un ejemplo de juguete el posteado. Gracias por el aporte. Saludos !