Джексон Де / Сериализация даты в строку в общих картах
Существует множество примеров кода Джексона в / из кода java.util.Date, но все они, похоже, используют аннотацию POJO. У меня есть общие Карты скаляров, которые я хочу де / сериализовать в JSON. Это текущая настройка десериализатора; очень простой:
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;
}
Я понимаю, что dateserializer может превратить java.util.Date в строку ISO 8601. Это идет другим путем, который озадачивает меня. Очевидно, что в документе JSON без контекста строка является строкой, поэтому я не могу знать, была ли она когда-то датой. Поэтому я готов набрать это и проверить все десериализованные строки, и если они пахнут как YYYY-MM-DDTHH: MM: SS.sss datetime, тогда я сделаю java.util.Date вместо простой передачи строки. Итак, учитывая:
{ "name": "buzz",
"theDate": "2013-09-10T12:00:00.000"
}
будет давать
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
Но это означает, что десериализатор должен возвращать два разных типа, и я не смог понять, как это сделать в Джексоне. Кто-нибудь знает хороший, компактный пример, который будет нюхать строки, похожие на даты, и превращать их в даты, оставляя другие в виде строк?