在Tomcat6或Tomcat7或WAS7上运行时,以下代码始终将内部java.util.Date
属性打印为yyyy-MM-DD格式,而不是毫秒格式。
ObjectMapper om = new ObjectMapper();
System.out.println(om.writeValueAsString(myObject));
独立运行时,上面的代码打印出正确的毫秒格式。
服务器有什么干扰吗?我在这里使用Jackson 2.0.6和Spring 3.1.2。
结果: 我发现问题是我的Date对象正在获取java.sql.Date。如果你使用的是java.sql.Date,我猜你不会得到时间戳。
答案 0 :(得分:1)
Jackson序列化配置可能会在很多地方被踩到,包括spring和/或hibernate,如下所述:Where do I specify Jackson SerializationConfig.Feature settings in Spring 3.1
可能有更多正确的解决方案可以阻止Spring / Hibernate做他们正在做的事情,但如果由我决定,我会做以下事情:
ObjectMapper om = new ObjectMapper();
om.setDateFormat(null);
System.out.println(om.writeValueAsString(myObject));
答案 1 :(得分:0)
结果:我发现问题是我的Date对象正在运行 java.sql.Date。如果你正在使用,我猜你不会得到时间戳 java.sql.Date。
在java.sql.Date的情况下,Jackson没有使用属性WRITE_DATES_AS_TIMESTAMPS或来自setDateFormat的格式。为了使它成为可能需要为ObjectMapper提供特殊的Serializer。
类似的东西:
import java.io.IOException;
import java.text.DateFormat;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
public class SqlDateSerializer extends StdSerializer<java.sql.Date> {
private static final long serialVersionUID = 1L;
public SqlDateSerializer() {
super(java.sql.Date.class, true);
}
private ThreadLocal<DateFormat> DATE_FORMAT
= ThreadLocal.withInitial(()
-> new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"));
@Override
public void serialize(java.sql.Date value, JsonGenerator gen, SerializerProvider provider) throws IOException {
String formatted = DATE_FORMAT.get().format(value);
gen.writeString(formatted);
}
}
用法:
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(java.sql.Date.class, new SqlDateSerializer());
ObjectMapper om = new ObjectMapper();
om.registerModule(simpleModule);