[RESOLVIDO] Vraptor 3 serialize enum JSON

Pessoal,

Este tópico, http://www.guj.com.br/java/219161-vraptor-3-serialize-enum-json, fala exatamente o que estou precisando.
Mas como já tem tempo, gostaria de saber se há outra(nova) forma de fazer essa conversão. Se não o que eu coloco no new SeuEnumConverter().

Preciso pegar este enum:

public enum FormaPagamentoNotaFiscalEmunerator {
	
	AVISTA("0 - A Vista", 0), 
	APRAZO("1 - A Prazo", 1),
	OUTROS("2 - Outros", 2);
	
	private final String nome;
	private final int valor;
	
	FormaPagamentoNotaFiscalEmunerator(String nome, int valor){
		this.nome = nome;
		this.valor = valor;
    }
	
	public String getNome() {
		return nome;
	}
	
	public int getValor() {
		return valor;
	}
	
}

E retornar o Json abaixo:

Desde já, obrigado pela atenção.
:slight_smile:

escreva um converter do XStream pra isso… algo como:

@Component
public class FormaPagamentoNotaFiscalEmuneratorConverter implements Converter { //do XStream

    //canConvert vc retorna true se for o seu enum
    //unmarshall pode deixar em branco

    //marshal, vc pega o Object, faz o cast pro seu enum, e faz:
    public void marshall(....) {
     writer.startNode("valor");
     writer.setValue(meuEnum.getValor());
     writer.endNode();
     //mesma coisa pro nome.
   }
}

Lucas, obrigado pela resposta.

Sinceramente, quando vi a resposta não entendi nada.
Comecei a pouco tempo com vraptor e gostei exatamente por ser bastante simples e intuitivo.

Fui atrás e tentei aprender um pouco sobre. Consegui ver alguns exemplos que tratava do mesmo problema, mas ainda não foi.

Ficou assim o converter:

public class FormaPagamentoNotaFiscalEmuneratorConverter implements Converter<FormaPagamentoNotaFiscalEmunerator> { //do XStream  
	
	//marshal, vc pega o Object, faz o cast pro seu enum, e faz:  
    public void marshall(Object meuEnum, HierarchicalStreamWriter writer, MarshallingContext context) {
     writer.startNode("valor"); 
     writer.setValue( Integer.toString( ((FormaPagamentoNotaFiscalEmunerator) meuEnum).getValor()) );  
     writer.endNode();
     writer.startNode("nome"); 
     writer.setValue(((FormaPagamentoNotaFiscalEmunerator) meuEnum).getNome());  
     writer.endNode();
     //mesma coisa pro nome.  
   }  
    
    public boolean canConvert(Class type) {
    	return 	type.isEnum() && type.equals(FormaPagamentoNotaFiscalEmunerator.class);
    }

	public FormaPagamentoNotaFiscalEmunerator convert(String arg0,
			Class<? extends FormaPagamentoNotaFiscalEmunerator> arg1,
			ResourceBundle arg2) {
		// TODO Auto-generated method stub
		return null;
	}
    
}

Estou tentando assim:

Mas ele continua retornando como antes:

Onde que foi errei? :slight_smile:

faltou o @Component em cima do converter =)

Lucas, eu tenho a anotação na classe, só não copiei aqui.

Tenho alguns converter, por exemplo para BigDecimal, com a anotação:

preciso dessa anotação para este converter?

Outra coisa, a classe fica dando erro de metodos não implementados, no caso o metodo convert, incluir o mesmo mas sem nenhum implementação.

Segue todo o código:

import java.util.ResourceBundle;

import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;

import br.com.caelum.vraptor.Converter;
import br.com.caelum.vraptor.ioc.Component;
import br.com.creati.smarterp.sistema.util.FormaPagamentoNotaFiscalEmunerator;

@Component
public class FormaPagamentoNotaFiscalEmuneratorConverter implements Converter<FormaPagamentoNotaFiscalEmunerator> { //do XStream  
	
	//marshal, vc pega o Object, faz o cast pro seu enum, e faz:  
    public void marshall(Object meuEnum, HierarchicalStreamWriter writer, MarshallingContext context) {
     writer.startNode("valor"); 
     writer.setValue( Integer.toString( ((FormaPagamentoNotaFiscalEmunerator) meuEnum).getValor()) );  
     writer.endNode();
     writer.startNode("nome"); 
     writer.setValue(((FormaPagamentoNotaFiscalEmunerator) meuEnum).getNome());  
     writer.endNode();
     //mesma coisa pro nome.  
   }  
    
    public boolean canConvert(Class type) {
    	return 	type.isEnum() && type.equals(FormaPagamentoNotaFiscalEmunerator.class);
    }

	public FormaPagamentoNotaFiscalEmunerator convert(String arg0,
			Class<? extends FormaPagamentoNotaFiscalEmunerator> arg1,
			ResourceBundle arg2) {
		// TODO Auto-generated method stub
		return null;
	}
    
}

O que está faltando? A forma que estou tentando serializar está correta?

Desde já obrigado.

vc tá usando o Converter do VRaptor, é pra usar o Converter do XStream, que tem esses 3 métodos que já estão na sua classe.

aparentemente é só isso que está errado.

Lucas, funcionou!

Mas um vez salvando nossas vidas, obrigado!

Resolveu meu problema. Cria o Xstream converter e anota ele com @Component.

@Component
public class EnumJsonSerialization implements Converter 
{
	@Override
	public boolean canConvert(Class type) {
		return type.isEnum();
	}

	@Override
	public void marshal(Object enun, HierarchicalStreamWriter writer,	MarshallingContext context) 
	{
		for( Field field : enun.getClass().getDeclaredFields() )
		{
			if( ! field.isEnumConstant() )
			{
				String name = field.getName();
				String getMethod = "get"+ name.substring(0,1).toUpperCase() + name.substring(1,name.length());
				
				try {
					Method method = enun.getClass().getMethod(getMethod);
					
					writer.startNode(name);
					writer.setValue(method.invoke(enun).toString());
					writer.endNode();
				} 
				catch (Exception e) {
				}
			}
		}
	}

	@Override
	public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context){
		return null;
	}
}