Estou tentando ter um formato de data personalizado na saída do Gson, mas .setDateFormat(DateFormat.FULL)
não parece funcionar e é o mesmo com .registerTypeAdapter(Date.class, new DateSerializer())
.
É como se o Gson não se importasse com o objeto "Data" e o imprimisse à sua maneira.
Como posso mudar isso?
obrigado
EDITAR:
@Entity
public class AdviceSheet {
public Date lastModif;
[...]
}
public void method {
Gson gson = new GsonBuilder().setDateFormat(DateFormat.LONG).create();
System.out.println(gson.toJson(adviceSheet);
}
Eu sempre uso java.util.Date
; setDateFormat()
não funciona :(
Respostas:
Parece que você precisa definir formatos para a parte de data e hora ou usar a formatação baseada em String. Por exemplo:
ou usando java.text.DateFormat
ou faça isso com serializadores:
Acredito que os formatadores não podem produzir registros de data e hora, mas esse par serializador / desserializador parece funcionar
Se estiver usando o Java 8 ou superior, você deve usar os serializadores / desserializadores acima, da seguinte maneira:
fonte
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
funciona.Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
funcionaO formato acima parece melhor para mim, pois tem precisão de até milis.
fonte
Como ML apontou, o JsonSerializer funciona aqui. No entanto, se você estiver formatando entidades do banco de dados, use java.sql.Date para registrar seu serializador. O desserializador não é necessário.
Este relatório de erros pode estar relacionado: http://code.google.com/p/google-gson/issues/detail?id=230 . Eu uso a versão 1.7.2 embora.
fonte
Caso você odeie classes Inner, aproveitando a interface funcional, você pode escrever menos código no Java 8 com uma expressão lambda.
fonte
Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, (JsonDeserializer) (json, typeOfT, context) -> new Date(json.getAsLong())).create();
Isso realmente não vai funcionar. Não há tipo de data no JSON. Eu recomendaria serializar para ISO8601 e para trás (para agnósticos de formato e compatíveis com JS). Considere que você precisa saber quais campos contêm datas.
fonte
Você pode especificar o formato
Gson gson = builder.setDateFormat("yyyy-MM-dd").create();
neste método, em vez deyyyy-MM-dd
usar outros formatosfonte
Isso é um bug . Atualmente, você também precisa definir um
timeStyle
ou usar uma das alternativas descritas nas outras respostas.fonte
Estou no Gson 2.8.6 e descobri esse bug hoje.
Minha abordagem permite que todos os nossos clientes existentes (móveis / web / etc) continuem funcionando como estavam, mas adiciona um pouco de manipulação para aqueles que usam formatos de 24 horas e permite milis também, por uma boa medida.
Eu mantive a serialização da mesma forma que todos os clientes entendem o formato de data json padrão.
Normalmente, acho que não é uma boa prática usar blocos try / catch, mas esse deve ser um caso bastante raro.
fonte