2

在 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,我猜您不会得到时间戳。

4

2 回答 2

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));
于 2012-09-29T22:13:58.247 回答
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);
于 2018-05-22T07:15:23.627 回答