Jackson De / Serializing Date-to-String-to-Date w ogólnych mapach
Istnieje wiele przykładów Jacksona do / z kodu java.util.Date, ale wszystkie wydają się wykorzystywać adnotację POJO. Mam ogólne mapy skalarów, które chcę de / serializować do JSON. To jest aktualna konfiguracja deserializatora; bardzo prosty:
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;
}
Grok, że dataserializator może zmienić java.util.Date w ciąg znaków ISO 8601-ish. To idzie w drugą stronę, która mnie zastanawia. Oczywiście w dokumencie JSON bez kontekstu łańcuch jest ciągiem znaków, więc nie mogę wiedzieć, czy był kiedyś datą. Więc jestem gotów na wpisanie tego i zbadanie wszystkich ciągów deserializowanych, a jeśli pachną tak jak YYYY-MM-DDTHH: MM: SS.sss datetimes, to zrobię java.util.Date zamiast przekazywać String. Tak podane:
{ "name": "buzz",
"theDate": "2013-09-10T12:00:00.000"
}
przyniesie
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
Ale to oznacza, że deserializer musi zwrócić dwa różne typy i nie byłem w stanie dowiedzieć się, jak to zrobić w Jackson. Czy ktoś wie o dobrym, zwartym przykładzie, który wyczuje ciągi daty i przekształci je w Daty, pozostawiając inne jako Ciągi?