Tenho uma Dúvida Desafiadora!
No curso de REST com JAX-RS e Jersey aprendemos a Serializar e Deserializar um objeto em JSON da seguinte forma (Usando a biblioteca GSON da google)
Serialização
Gson gson = new Gson();
String stringJson = gson.toJson(objeto);
Deserialização
Gson gson = new Gson();
Objeto objeto = gson.fromJson(conteudoJson, Objeto.class);
Baseado Nisso criei um uma configuração para fazer uma Serialização e Deserialização personalizada, seguindo a documentação da google GSON em uma classe chamada, JsonConfig segue a classe:
import java.io.Writer;
import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.fasterxml.jackson.core.JsonParser;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.stream.JsonWriter;
import br.com.olimpoapi.modelo.Usuario;
public class JsonConfig {
private static final SimpleDateFormat DATA_FORMATADA = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
public static <T> GsonBuilder getGsonBuilder() {
GsonBuilder builder = new GsonBuilder();
//Define Comportamento Ao Deserializar uma Data
builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
//Deserializa o Seguinte formato 07/03/2017 17:26:01 em java.util.Date
//Exemplo de Uso: Gson gson = JsonConfig.getGsonBuilder().create(); Usuario usuario = gson.fromJson(stringJson, Usuario.class);
@Override
public Date deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
try {
return DATA_FORMATADA.parse(json.getAsString()); //Retorna um Date com a data formatada
} catch (ParseException e) {
return null;
}
}
});
//Define o Comportamento ao Serializar uma Data
builder.registerTypeAdapter(Date.class, new JsonSerializer<Date>() {
//Serializa o Formato de java.util.Date para 07/03/2017 17:26:01
// Exemplo de Uso: Gson gson = JsonConfig.getGsonBuilder().create(); String usuariojson = gson.toJson(objetoUsuario);
@Override
public JsonElement serialize(Date data, Type typeOft, JsonSerializationContext context) {
try {
String datajson = DATA_FORMATADA.format(data); // converte a data em string no formato adequado
return new JsonPrimitive(datajson); //tranforma a string em um tipo Json primitivo
}catch (Exception e) {
return null;
}
}
});
return builder;
}
}
Perfeito! para usar esta classe no lá no REST - JAX-RS e Jersey eu faço o seguinte
Serialização
Gson gson = JsonConfig.getGsonBuilder().create();
String stringJson = gson.toJson(objeto);
Deserialização
Gson gson = JsonConfig.getGsonBuilder().create();
Objeto objeto = gson.fromJson(conteudoJson, Objeto.class);
O problema é que com o Vraptor quando eu faço
@Path("/")
@Post
@Consumes("application/json")
public void adiciona(Objeto objeto) {
}
Ao postar o Json O VRaptor Deserializa automaticamente o meu texto em um tipo objeto, Bom isso é Perfeito!!Porém Preciso usar minha serialização e deserialização personalizada.
como eu consigo usar o meu
Gson gson = JsonConfig.getGsonBuilder().create();
no lugar do gson default?
Pesquisei algumas coisas porém ainda não obtive êxito. Por Favor ajudem o pequeno gafanhoto aqui. Se conseguirem um exemplo de código por mais simples que seja já dá uma grande ajuda! Abraço a Todos