我在一个映射中序列化一些java.util.Dates。日期被序列化为Long (Jackson将Date实例的JSON值写入Long字符串),然而,它们不会被反序列化为Date实例,而是作为Long实例。
我想让Jackson将Date反序列化为Date对象(而不是格式化的String或Long),我该如何实现呢?
Map<String, Comparable<?>> change = new HashMap<String, Comparable<?>>();
change.put("DESCRIPTION", "LIBOR");
change.put("RATE", "1.8");
change.put("DATE", Util.newDate(2009, 7, 1)); // Returns a java.util.Date产生
{"DESCRIPTION":"LIBOR"},{"RATE":"1.8"},{"DATE":1246402800000}, ... }这也没关系。但是,当我希望它成为java.util.Date的实例时,日期字符串被反序列化(膨胀)回java.lang.Long的实例中--它就是这样开始的。也就是说,Map change现在包含三个条目: Description as a String、Rate as a Float和Date as a Long。
发布于 2011-03-31 19:05:19
您希望使用org.codehaus.jackson.map.JsonDeserializer并编写定制的反序列化代码。类似于:
public class DateDeserializer extends JsonDeserializer<Long> {
@Override
public Long deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
... custom logic
}
}到目前为止,我猜您必须弄清楚Long属性何时需要反序列化。也许在你的pojos上使用注解?
发布于 2011-03-31 04:30:47
我不知道日期的字符串表示是否会有任何帮助?
如果是,那么您可以尝试在ObjectMapper上设置DateFormat。然后,反序列化将采用可读的字符串格式。
例如,对于以下代码,输出将类似{“birthDate”:“2011年3月30日”}
@Test
public void testJsonConvertDate(){
ObjectMapper mapper = new ObjectMapper();
mapper.getSerializationConfig().setDateFormat(DateFormat.getDateInstance(DateFormat.LONG));
StringWriter stringWriter = new StringWriter();
try {
mapper.writeValue(stringWriter, Arrays.asList(new TestUser(new Date())));
}
catch (IOException e) {
e.printStackTrace();
}
System.out.println(stringWriter.toString());
}
private class TestUser {
Date birthDate;
private TestUser(Date birthDate) {
this.birthDate = birthDate;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
}https://stackoverflow.com/questions/5489083
复制相似问题