Jackson と 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の日付時刻のような匂いがする場合は、文字列を返すだけでなく、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
しかし、これは、デシリアライザーが 2 つの異なる型を返さなければならないことを意味し、Jackson でこれを行う方法を理解できませんでした。日付のような文字列を盗聴し、それらを日付に変換し、他のものを文字列として残す、適切でコンパクトな例を知っている人はいますか?