Estou Tentando fazer uma taglib genérica para combos ajax usando vraptor, e eu preciso que o serialize me retorne sem um padrão de chaves.
O Método do Controlador eh o seguinte:
@Get @Path("/evento/comboAjax.json")
public void loadCidade(String siglaEstado) {
List<Cidade> cidade = cidadeDao.listaPorEstado(siglaEstado);
result.use(Results.json()).withoutRoot().from(cidade)
.exclude("sigla_estado")
.serialize();
}
e ele retorna um json da seguinte forma:
onde codigo e nome são os nomes dos campos desse caso específico, porém esses campos em outros casos poderão ter nomes diferentes, então eu precisava que a função me retornasse sempre algo como
Por que que você, ao invés de customizar a JSON, não muda um pouquinho a forma de ler esse JSON:
Imagine a seguinte function que recebe esse JSON ai em cima:
é que no caso estou usando a “$.getJSON” do jquery e achei que seria mais “elegante” mudar o json em si, fora que é bom saber se há como customizar o json pois pode ser útil em outros casos tb, mas vlw pela dica também vou tentar dessa forma.
Rafael_Guerreiro
Dá para usar dessa forma sim. Não acho que fique menos elegante, visto que esse é um comportamento bem interessante de um objeto javascript (se comporta igualzinho um Array).
Eu não sei se tem como mudar a forma de serializar o JSON…
Mas dá para você alterar o toString() da sua classe:
publicclassCidade{privateintcodigo;privateStringnome;@OverridepublicStringtoString(){return"{'value':'"+codigo+"', 'text':'"+nome+"'}";}// getters e setters}
renanreismartins
de uma olhadinha na doc do Xstream lá tem como vc customizar como os atributos são serializaveis…
porém como quer algo generico, eu criaria uma classe que recebe 2 params: “value” e “text”, nela vc pode receber seus valores e serializar.
Colocar isso no toString nao me parece uma boa opção, apesar de resolver seu problema.
abrasss
R
rishibashi
bacana isso, mas fazendo isso nao deixaria de funcionar alguma outra funcao do propio vraptor q pode estar usando essa tostring padrao?
Rafael Guerreiro:
Dá para usar dessa forma sim. Não acho que fique menos elegante, visto que esse é um comportamento bem interessante de um objeto javascript (se comporta igualzinho um Array).
Eu não sei se tem como mudar a forma de serializar o JSON...
Mas dá para você alterar o toString() da sua classe:
publicclassCidade{privateintcodigo;privateStringnome;@OverridepublicStringtoString(){return"{'value':'"+codigo+"', 'text':'"+nome+"'}";}// getters e setters}
R
rishibashi
renanreismartins:
de uma olhadinha na doc do Xstream lá tem como vc customizar como os atributos são serializaveis…
porém como quer algo generico, eu criaria uma classe que recebe 2 params: “value” e “text”, nela vc pode receber seus valores e serializar.
Colocar isso no toString nao me parece uma boa opção, apesar de resolver seu problema.
abrasss
Vou dar uma estudada nesse Xstream vlw pela dica
Rafael_Guerreiro
Não é uma boa opção, embora seja sempre importante a gente sobrescrever o toString(), equals(Object obj), hash()…
É verdade, me esqueci desse cara! Essa é uma boa solução para você.
@rishibashi
Não. É sempre importante sobrescrever esses métodos. Mesmo que não fiquem em formato de objetos JS…
R
rishibashi
estou começando a considerar a opção de tratar isso no JS como primeiramente vc mencionou, problema eh q meu jquery nao esta muito atualizado, como vcs modificariam a funcao a seguir para aceitar qualquer tipo de chave do json?
Gostei desse jeito de montar, fica ateh mais simples que ooutro menos linhas, mas o this[0] nao esta funcionando, fica undefined, ele soh funciona se eu chamar assim: this.nome, this.codigo
Assim você faz a pessoa chamar pouca coisa e o seu plugin faz o restante (como desabilitar o campo enquanto carrega).
Aqueles valores que eu passei para você são os atributos que precisamos enviar para o $.ajax do jQuery: http://api.jquery.com/jQuery.ajax/.
De uma olhada no jQuery Boilerplate para você ver algumas boas práticas na hora de criar plugins: http://br.jqueryboilerplate.com/
R
rishibashi
por enquanto eu to soh tentando fazer funcionar ela generica mesmo p/ dpeois organizar, a funcao loadselect nao ehj nem originalmente minha, eu peguei um a biblioteca qe achei em um exemplo antiogo aki mesmo no forum e estou tentando fazer funcionar genericamente
e transformar a lista de cidade (ou de qqer outra coisa) na lista dessa classe nova…
assim ele vai fazer direitinho.
Hmmm entao criando outra classe, parece uma boa alternativa tb. Vlw.
R
rishibashi
consegui resolver, nao sei se foi da melhor forma mas funcionou, resolvi por javascript mesmo, gostaria saber da opiniao de vcs pois como se trata de javascript, será que terei problemas com essa implementação em algum navegador?
Isso faz o q eu precisava, que é generalizar as chaves do Json, eu transformo o objeto json em string, extraio as chaves e colco valores padrao nela, entao todo json que passar por esse codigo as chaves serão “chave” e “valor”, depois eu converto o json novamente em objeto e envio p/ funcao de montaro select, comentei o codigo para melhor compreensao.