Java Jackson不支持ISO日期格式
编写同时支持Xml和JSON媒体类型的web服务。遵循ISO标准以支持日期格式Java Jackson不支持ISO日期格式,java,json,date,jackson,Java,Json,Date,Jackson,编写同时支持Xml和JSON媒体类型的web服务。遵循ISO标准以支持日期格式yyyy-MM-dd'T'HH:MM:ss.SSSXXX 为了在xml中支持这种格式,我编写了一个DateAdapter类,它负责对日期字段进行封送和取消封送处理。 Json格式有一个自定义序列化和反序列化类。它的实现几乎类似于适配器类。但它抛出了一个例外 @Override public void serialize(Date aDate, JsonGenerator aJsonGenerator, Seri
yyyy-MM-dd'T'HH:MM:ss.SSSXXX
为了在xml中支持这种格式,我编写了一个
DateAdapter
类,它负责对日期字段进行封送和取消封送处理。Json格式有一个自定义序列化和反序列化类。它的实现几乎类似于适配器类。但它抛出了一个例外
@Override
public void serialize(Date aDate, JsonGenerator aJsonGenerator, SerializerProvider aSerializerProvider)
throws IOException, JsonProcessingException {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
String dateString = dateFormat.format(aDate);
aJsonGenerator.writeString(dateString);
}
例外情况:
Illegal pattern character 'X'
at java.text.SimpleDateFormat.compile(SimpleDateFormat.java:768)
使用jackson v2.2.1
工作适配器实现完全相同
Java 7中添加了
SimpleDataFormat
模式字母X
。您必须使用较低版本的JRE
约普·艾根(Joop Eggen)的评论修正了这个问题。来自SimpleDataFormat的简单日期格式(“yyyy-MM-dd'HH:MM:ss.SSSXXX”)代码>到简化格式(“yyyy-MM-dd'HH:MM:ss.SSSZ”)代码>修复了该问题。您可以创建反序列化程序并将其用作@Annotation 公共类TemporalDeserializerLocalDateTime扩展JsonDeserializer{
@Override
public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationCtx)
throws IOException, JsonProcessingException {
ObjectCodec oc = jsonParser.getCodec();
String content = oc.readValue(jsonParser, String.class);
return LocalDateTime.parse(content);
}
}
公共类付费资源{
@JsonDeserialize(using = TemporalDeserializerLocalDateTime.class)
private LocalDateTime paymentDate;
}
那么Z而不是XXX?或XXXX呢?请务必查看实际使用的java版本的api文档。@JoopEggen您说得对。谢谢您的回答。@HimanshuYadav这并不能解释错误消息。另外,不允许使用四个
X
。嗯Z
并不能完全解决错误。日期w使用Z
看起来像2014-08-06T13:18:30.504-0400
但是使用XXX
看起来像2014-08-06T13:18:30.504-04:00
那么为什么SimpleDateFormat
在为我用于Xml响应的XmlAdapter
类工作呢。@HimanshuYadav我不这么认为。XmlAdapter
是专业的bably未使用。抱歉。但事实并非如此。如果我删除XmlAdapter,响应将以不同的格式出现。不过我已经找到了解决方案。
@JsonDeserialize(using = TemporalDeserializerLocalDateTime.class)
private LocalDateTime paymentDate;
}