[Resolvido] VRaptor - Mudar a Forma de Serializar Objeto -> JSON

Pessoal, tenho um objeto do tipo CPF (por exemplo), esse objeto tem alguns métodos e um toString que retorna o CPF formatado certinho.

Quando serializo ele para JSON usando o VRaptor, ele gera o seguinte:

{“cpf”: {“CPF”: “000.000.000-00”}}

Eu queria que fosse só:

{“cpf”: “000.000.000-00”}

Existe uma forma de fazer isso?

Queria que fosse possível fazer um “CPFSerializer”, onde eu formataria como ele deveria ser representado no JSON (ou XML por exemplo), ou qual field ele deveria usar por default na serialização.

Abraços!

vc pode usar a opção .withoutRoot:

result.use(Results.json()).withoutRoot().from(cpf).serialize();

[quote=Lucas Cavalcanti]vc pode usar a opção .withoutRoot:

result.use(Results.json()).withoutRoot().from(cpf).serialize(); [/quote]

Hum mas ai não resolve o caso de eu usar esse CPF em um usuário né?

Por exemplo:


		User user = new User();
		user.setNome("Rodrigo");
		user.setCPF(cpf);

Se eu usar sua sugestão, só vai aparecer o nome, e se eu usar o recursive vai aparecer:

Queria que fosse:

Tem como?

entendi… tem como sim.

se vc tá com o VRaptor 3.4.1, crie essa classe:

@Component
public class CPFConverter implements SingleValueConverter { // do XStream
   // fromString pode deixar em branco

   public String toString(Object obj) {
      CPF cpf = (CPF) obj;
      return cpf.getCPF();
   }
}

ou algo do tipo.

Hum entendi Lucas, mas como eu registro esse conversor para ser usado pelo VRaptor na hora de fazer a serialização desse objeto?

Cara comi bola e esqueci de por o @Component, agora deu certinho, ficou exatamente como eu precisava!

Muito obrigado!

Putz mas agora surgiu um outro probleminha, minha ideia era que esse tipo de classe implementasse Document (uma interface simples minha apenas para dizer que determinadas classes são documentos).

Continua funcionando, mas ai serializa assim:

É esperado isso?

ele faz isso pra conseguir deserializar depois…

vc mudou o converter para Document, ao invés de CPF?

[quote=Lucas Cavalcanti]ele faz isso pra conseguir deserializar depois…

vc mudou o converter para Document, ao invés de CPF?[/quote]

Isso, ai na classe User deixei como Document ao invés de CPF. Até da pra entender porque ele faz isso, embora não seja o resultado que eu queria.

Mas é uma situação contornável!

Muito obrigado Lucas!

Cara deixa aproveitar que estou falando com você e perguntar, existe forma de eu registrar um Component no VRaptor sem ser pela annotation? Algo como:

Valeuu!

Antes de eu te responder, pra que você quer registrar um componente desse jeito?

Hahaha tinha certeza que vc ia perguntar isso, eu devia ter explicado logo de cara rs

É o seguinte, as classes Document (CPF, RG, CNPJ, etc) ficarão dentro de um Jar para serem usadas em vários projetos.

Nem todos serão Web, só que para funcionar com o VRaptor preciso da annotation @Component.

Não acho elegante a dependência do VRaptor para um projeto não Web (um ponte de vista meu).

Por isso pensei em fazer algo assim no Jar que contem as classes Document:


try {
     VRaptor.registerComponent(Document.class);
} catch (Exception e) {
     System.out.println("Nao tem VRaptor, entao nao precisa registrar compoenent para funcionar o Serialize de JSON.");
}

E no caso de usar o XStream, ai a pessoa registra o conversor nele normalmente como faria em qualquer outro projeto.

O que acha?

A dependência da anotação é só em tempo de compilação…

quem usar o jar não precisa ter o @Component no classpath, a menos que alguma outra classe tente ler essa anotação…

pode compilar o jar com o @Component lá dentro sem medo :wink:

[quote=Lucas Cavalcanti]A dependência da anotação é só em tempo de compilação…

quem usar o jar não precisa ter o @Component no classpath, a menos que alguma outra classe tente ler essa anotação…

pode compilar o jar com o @Component lá dentro sem medo ;)[/quote]

Aé? Eu achava que ele iria reclamar como quando usamos interface por exemplpo.

A então menos, acredito que não terei problemas, e nem preciso fazer aquele registro de @Component que estava comentando.

Muito obrigado Lucas!