Джексон Де / Сериализация даты в строку в общих картах

Существует множество примеров кода Джексона в / из кода 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

Но это означает, что десериализатор должен возвращать два разных типа, и я не смог понять, как это сделать в Джексоне. Кто-нибудь знает хороший, компактный пример, который будет нюхать строки, похожие на даты, и превращать их в даты, оставляя другие в виде строк?

Ответы на вопрос(4)

Ваш ответ на вопрос