Retorno customizado de json
09/07/2014 18:15
1
Olá pessoal,

Estou criando um webservice e preciso editar o json que o serviço retorna.
Para fazer isso estou utilizando o método JSON.registerObjectMarshaller da grails.converters.JSON no Bootstrap.
Eu tenho 2 domains que Trip e Person, sendo que Trip hasMany guest:Person.
Eu preciso exibir apenas alguns atributos de uma Person quando eu exibo uma Trip, então o registerObjectMarshaller da Trip fica assim:


JSON.registerObjectMarshaller( Trip ) {
def returnSet = [:]
returnSet.id = it.id
...
returnSet.guest = ["id":it.guest?.id,"name":it.guest?.name, "imageUrl":it.guest?.imageUrl]
...
return returnSet
}


O objetivo é gerar uma resposta assim:


{
"id":5,
...
"guest":[
{
"id":6,
"name":"guest6",
"imageUrl":"www.imagem.com/6"
},
{
"id":7,
"name":"guest7",
"imageUrl":"www.imagem.com/7"
}
]
...
}


Porém a resposta gerada é:


{
"id":5,
...
"guest":[
"id":[6,7],
"name":["guest6","guest7"]
"imageUrl":["www.imagem.com/6","www.imagem.com/7"]
]
...
}


Alguém sabe como gerar a resposta correta sem ter que alterar o registerObjectMarshaller da Person (eu não posso alterar ele)?
Tags: registerObjectMarshaller


1
Quando você renderiza uma resposta de um controlador como JSON, ele basicamente pode ir como o marshaller como você mostrou, ou então pode ser aplicado em um objeto qualquer.

Então, uma alternativa (sei que não é a mais linda, mas costuma funcionar bem) quando você quer expor apenas alguns dos campos ou mesmo customizar o formato da saída, é gerar um mapa no Groovy padrão e o definir como valor de retorno da sua action.

Aí você consegue ter controle total, pois pode escrever código como o abaixo, por exemplo:


def actionDeTeste() {
render(contentType: "text/json") {
[
qualquerAtributo:"seu valor",
outroAtributo:[nome:algo, objetoInterno:[nome:coisa]]
]
}


É bastante prático.


1
Olá, Thiago.

Já que tens as classes Trip e Person, porque não cria "wrappers" para elas e deixa o resto com o Grails?

Digamos, uma classe TripX w uma PersonX, apenas com os atributos que deseja.

Dai poderá usar apenas os "render yeuObjeto as JSON".


0
A vantajem no uso de "wrappers" seria o reuso.


0
Vantagem, perdão ^^'


0
Obrigado pessoal!

Utilizei a abordagem do Yoshi pois tenho vários métodos na classe que retornam o mesmo objeto, mudar cada método é mais trabalhoso.
11/07/2014 11:27



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto