Jackson De / Serialisieren von Datum-zu-String-zu-Datum in generischen Maps

Es gibt viele Beispiele für Jackson in / aus java.util.Date-Code, aber alle scheinen POJO-Annotationen zu nutzen. Ich habe generische Maps von Skalaren, die ich für JSON de / serialisieren möchte. Dies ist das aktuelle Deserializer-Setup. sehr einfach:

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;
}

Ich befürchte, dass ein Dateserializer java.util.Date in einen ISO 8601-ish-String verwandeln kann. Es geht in die andere Richtung, was mich verwirrt. In einem JSON-Dokument ohne Kontext ist eine Zeichenfolge eindeutig eine Zeichenfolge, sodass ich nicht wissen kann, ob es sich um ein Datum handelte. Also bin ich bereit, dies zu tippen und alle zu deserialisierenden Strings zu untersuchen. Wenn sie nach JJJJ-MM-TTTHH: MM: SS.sss riechen, dann werde ich ein java.util.Date erstellen, anstatt nur einen String zurückzugeben. So gegeben:

{ "name": "buzz",
  "theDate": "2013-09-10T12:00:00.000"
}

wird nachgeben

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

Dies bedeutet jedoch, dass der Deserialisierer zwei verschiedene Typen zurückgeben muss, und ich konnte nicht herausfinden, wie dies in Jackson geschehen soll. Kennt jemand ein gutes, kompaktes Beispiel, das nach datumsähnlichen Zeichenfolgen sucht und sie in Datumsangaben umwandelt, sodass andere Zeichenfolgen bleiben?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage