Geração de JSONArray via vraptor

Bom dia caros amigos, estou utilizando uma grid nomeada DataTable(http://datatables.net/) em jquery, até ai beleza mas para a grid funcionar eu necessito serializar o conteudo da minha lista em formato de JSONArray, que seria no estilo abaixo

{ "aaData": [ ["Trident","Internet Explorer 4.0","Win 95+","4","X"], ["Trident","Internet Explorer 5.0","Win 95+","5","C"], ["Trident","Internet Explorer 5.5","Win 95+","5.5","A"], ["Trident","Internet Explorer 6","Win 98+","6","A"], ["Trident","Internet Explorer 7","Win XP SP2+","7","A"], ["Trident","AOL browser (AOL desktop)","Win XP","6","A"], ["Gecko","Firefox 1.0","Win 98+ / OSX.2+","1.7","A"], ["Gecko","Firefox 1.5","Win 98+ / OSX.2+","1.8","A"] ] }

o “problema” é que o serialize padrão do vraptor retorna para mim o “nome do campo”+“valor do campo” tem como alterar isso?
pois o padrão atual a grid não consegue ler tal formato.

e como posso fazer para utilizar o json gerado no meu js

$(document).ready(function() { $('#example').dataTable( { "bProcessing": true, "sAjaxSource": 'aqui vai o link da pagina com o json gerado em formato array' } ); } );

Muito obrigado a todos…

[]'s

não tem um jeito direto de gerar esse array…

Vc pode: transformar seus dados em uma List<List> e serializar com o withoutRoot()…

ver na api da dataTable se vc pode passar uma option com uma função que converte do retorno do vraptor pra sua array de arrays… geralmente os plugins do jquery deixam vc fazer isso…

de qqer forma, pra usar o json gerado pelo vraptor, basta vc colocar o link pra url do vraptor, algo do tipo:

@Path("/algum/caminho")
public void algumaLogica() {
   //...
   result.use(json()).from(objeto, alias).serialize();
}

daí vc usa como ajaxSource /seuContextPath/algum/caminho

Obrigado lucas pela resposta, já imaginei q teria q fazer algo similar, mas imagino q seria mais facil eu já pegar os dados via hibernate e criar um metodo meu para serializar da forma que quero do que fazer uma function no jquery para eliminar os “cabeçalhos” dos fields no json… estou errado? alguma forma mais cabivel de fazer isso?

[]'s

se vc fizer a busca do hibernate do seguinte jeito:

session.createQuery("select campo1, campo2, campo3 from Entidade").list();

ou o equivalente em Criteria, o hibernate vai te retornar uma List<Object[]> e mto provavelmente se vc fizer no vRaptor:

result.use(json()).withoutRoot().from(aListaRetornadaPelaQueryAcima).serialize();

o resultado já vai ser algo bem parecido com o que vc precisa… dá uma testada e vê se é isso mesmo

Ola lucas obrigado pela resposta, mas naum consegui utilizar oque foi me passado

@Get @Path("/produtos")

public void buscaJson(String nome) {
	result.use(json()).withoutRoot().from(dao.listaTudo()).serialize(); 
}

da erro no withoutRoot ele fala para dar um cast mas acho q tah errado isso não?

obrigado

vc tah com a última versão do vraptor? a 3.1.2?

ixi, vai ser isso então estou usando a a 3.1.1 vou atualizar e digo se está correto…

[]'s

kivervinicius,

Precisei utilizar uma DataTable recentemente, e a solução que encontrei, e que fecha com as orientações passadas pelo Lucas foram as seguintes:

P/ DataTable que esteja configurada com bServerSide: false

@Get
@Path("/segGrupoUsuario/dataTable.json")
public void getJsonDataTable() {
    List&lt;SegGrupoUsuario&gt; lstSegGrupoUsuario = segGrupoUsuarioDAO.pesquisarTodos();
    List&lt;Object[]&gt; listaTratada = new ArrayList&lt;Object[]&gt;();
    for (SegGrupoUsuario segGrupoUsuario : lstSegGrupoUsuario) {
        TabAtivo tabAtivo = segGrupoUsuario.getTabAtivo();
        String[] linha = {segGrupoUsuario.getId().toString(),
                                 segGrupoUsuario.getDescricao(),
                                 tabAtivo.getChAtivo() + "-" + tabAtivo.getDescricao()};
        listaTratada.add(linha);
    }

    result.use(Results.json())
            .from(listaTratada, "aaData")
            .serialize();
}

Caso a DataTable esteja configurada com bServerSide: true, seu json tem que ter uma estrutura diferente, e por isso fiz um Model p/ me auxiliar na serialização:

@Get
@Path("/segGrupoUsuario/dataTable.json")
public void getJsonDataTable() {
    List&lt;SegGrupoUsuario&gt; lstSegGrupoUsuario = segGrupoUsuarioDAO.pesquisarTodos();
    List&lt;Object[]&gt; listaTratada = new ArrayList&lt;Object[]&gt;();
    for (SegGrupoUsuario segGrupoUsuario : lstSegGrupoUsuario) {
        TabAtivo tabAtivo = segGrupoUsuario.getTabAtivo();
        String[] linha = {segGrupoUsuario.getId().toString(),
                                 segGrupoUsuario.getDescricao(),
                                 tabAtivo.getChAtivo() + "-" + tabAtivo.getDescricao()};
        listaTratada.add(linha);
    }

    DataTableModel dtModel = new DataTableModel();
    dtModel.setsEcho(new Long(new Date().getTime()).toString());
    dtModel.setiTotalRecords(lstSegGrupoUsuario.size());
    dtModel.setiTotalDisplayRecords(10);
    dtModel.setAaData(listaTratada.toArray()); // Convertendo a lista generica em Array. Dá erro de Cast ao serializar uma Lista/Map Generico.

    result.use(Results.json())
            .withoutRoot()
            .from(dtModel)
            .include("aaData")
            .serialize();
}

Modelo Auxiliar

class DataTableModel {
    
    private String sEcho;
    private int iTotalRecords;
    private int iTotalDisplayRecords;
    private Object[] aaData;

    // getter & setters
}

Espero ter ajudado.

:wink: