[RESOLVIDO] Problemas com Gson do Google: Unparseable date: “abr 19, 1991”

Trabalho com Gson do Google, para persistir e recuperar Objetos Java. Uso esse código para criar e formatar o Gson, com o Objetivo de prepapará-lo para receber certos formatos de datas, que vem de formulários e do banco de dados.

Gson g = new GsonBuilder().registerTypeAdapter(Date.class, new DateDeserializer()).create();

Essa é a classe DateDeserializer, que recebe um Gson e faz um parse com formatos de Datas, evitando a grande maioria dos erros.

public class DateDeserializer implements JsonDeserializer<Date> {

private static final String[] DATE_FORMATS = new String[]{
    "MMM dd, yyyy HH:mm:ss",
    "MMM dd, yyyy",
    "dd/MM/yyyy",
    "mmm dd, yyyy",
    "yyyy/MM/dd",
    "yyyy-MM-dd",
    "dd-MM-yyyy"
};

@Override
public Date deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jdc) throws JsonParseException {
    for (String format : DATE_FORMATS) {
        try {
            return new SimpleDateFormat(format, Locale.ROOT).parse(jsonElement.getAsString());
        } catch (ParseException e) {
        }
    }
    throw new JsonParseException("Unparseable date: \"" + jsonElement.getAsString()
            + "\". Supported formats: " + Arrays.toString(DATE_FORMATS));
}

}

O problema é no formato que pus no título: “abr 19, 1991”.
Sempre gera esse erro: Unparseable date, por mais que eu ja tenha colocado diversos formatos dentro da classe de Deserialização. Alguém já passou por isso ou sabe como solucionar…?

Experimente utilizar o locale assim: new Locale("pt", "BR")

Testei com esse código e funcionou:

SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy", new Locale("pt", "BR"));
Date date = sdf.parse("abr 19, 1991");
System.out.println(date);

Funcionou, mas agora me apresentou erro nesse Formato: “Apr 26, 2013 12:00:00 AM”… Tem alguma maneira de eu por múltiplos formatos…?

O problema não é o formato, é a lingua. As tuas datas podem ser em PT (abr) e EN (apr)?

Ela é salva no banco como Date, no formato yyyy-mm-dd, e o que faço é apenas tratar e converter no Gson.

Isso não respondeu à minha pergunta. As datas que chegam no Json podem ter nomes dos meses em PT e em EN?

Sim, acontece.

Então tens de tentar das duas formas, da que tinhas inicialmente e da que o @Lucas_Camara sugeriu…

 for (String format : DATE_FORMATS) {
    try {
        return new SimpleDateFormat(format, Locale.ROOT).parse(jsonElement.getAsString());
    } catch (ParseException e) {
    }
    try {
        return new SimpleDateFormat(format, new Locale("pt", "BR")).parse(jsonElement.getAsString());
    } catch (ParseException e) {
    }
}
1 curtida

Era isso mesmo, resolvi meu problema… Obrigado a todos que se prestaram a ajudar.!