Jackson De / Serializando Data-a-String-para-Data em mapas genéricos
Existem muitos exemplos de Jackson para / do código java.util.Date, mas todos eles parecem utilizar a anotação POJO. Eu tenho mapas genéricos de escalares que desejo de / serializar para JSON. Esta é a configuração atual do desserializador; muito simples:
public class JSONUtils {
static {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true);
mapper.setDateFormat(df); // this works for outbounds but has no effect on inbounds
mapper.getDeserializationConfig().with(df); // Gave this a shot but still does not sniff strings for a format that we declare should be treated as java.util.Date
}
public static Map<String,Object> parseJSON(InputStream is) {
Map<String,Object> data = null;
try {
data = mapper.readValue(is, Map.class);
} catch(Exception e) {
// ...
}
return data;
}
Eu percebo que um agente de datas pode transformar java.util.Date em uma string ISO 8601-ish. Está indo para o outro lado que me intriga. Claramente, em um documento JSON sem contexto, uma string é uma string, então não posso saber se foi uma data. Então, eu estou preparado para abaixar isso e examinar todas as strings sendo desserializadas e se elas tiverem o mesmo cheiro que as DDs de AAAA-MM-DDTHH: MM: SS.sss, então eu farei um java.util.Date ao invés de apenas retornar uma String. Então, dado:
{ "name": "buzz",
"theDate": "2013-09-10T12:00:00.000"
}
vai render
Map<String,Object> m = mapper.readValue(is, Map.class);
Object o1 = m.get("name"); // o1 is instanceof String
Object o2 = m.get("theDate"); // o2 is instanceof Date
Mas isso significa que o desserializador deve retornar dois tipos diferentes e não consegui descobrir como fazer isso em Jackson. Alguém sabe de um exemplo bom e compacto que farejará seqüências de datas e as transformará em datas, deixando outras como Strings?