【发布时间】:2011-05-24 14:36:04
【问题描述】:
我正在使用 Jersey + Jackson 为我的应用程序提供 REST JSON 服务层。我遇到的问题是默认的日期序列化格式如下所示:
"CreationDate":1292236718456
起初我以为它是一个 UNIX 时间戳……但它太长了。我的客户端 JS 库在反序列化这种格式时遇到了问题(它支持一堆不同的日期格式,但我想不支持这种格式)。我想更改格式,以便我的库可以使用它(例如 ISO)。我该怎么做...我找到了一段可以提供帮助的代码,但是...我应该把它放在哪里,因为我不控制 Jackson 序列化程序实例化(Jersey 可以)?
objectMapper.configure(
SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
我还为自定义 JacksonJsonProvider 找到了此代码 - 问题是 .. 如何让我的所有 POJO 类都使用它?
@Provider
public class MessageBodyWriterJSON extends JacksonJsonProvider {
private static final String DF = "yyyy-MM-dd’T'HH:mm:ss.SSSZ";
@Override
public boolean isWriteable(Class arg0, Type arg1, Annotation[] arg2,
MediaType arg3) {
return super.isWriteable(arg0, arg1, arg2,
arg3);
}
@Override
public void writeTo(Object target, Class arg1, Type arg2, Annotation[] arg3,
MediaType arg4, MultivaluedMap arg5, OutputStream outputStream)
throws IOException, WebApplicationException {
SimpleDateFormat sdf=new SimpleDateFormat(DF);
ObjectMapper om = new ObjectMapper();
om.getDeserializationConfig().setDateFormat(sdf);
om.getSerializationConfig().setDateFormat(sdf);
try {
om.writeValue(outputStream, target);
} catch (JsonGenerationException e) {
throw e;
} catch (JsonMappingException e) {
throw e;
} catch (IOException e) {
throw e;
}
}
}
【问题讨论】:
-
我发现这是 Jersey 1.1.5 和 Jersey 1.6 之间的变化 - 对于 Jersey 1.1.5,JSON 序列化如下所示:{"date":"2011-04-01T16:41 :18.707+00:00"} - 可能有一个提供背景信息的问题跟踪器项目
-
是的,管道和设置是最耗时的部分。我还没有弄明白。我建议只将日期输出为字符串,然后让您的客户处理将字符串转换为日期。这是关于用代码代替配置。我宁愿编写“在我的控制范围内”的代码,而不是我知道我可以控制但到目前为止似乎不受我控制的配置奥秘。如果没有明确的示例,配置很棘手,因此碰巧使用了您正在使用的相同 java 工具包。可移植性是一个有价值的目标,但确实很难。
标签: java serialization jersey jax-rs jackson